Duck Typing 鸭子类型
目录

鸭子类型(Duck Typing)的名字来源于“鸭子测试”: “当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子”。

这个用OO的话说就是:当对象B具有对象A的特定方法,我们就说对象B也是对象A。

WiKi上给出了一个Python的例子:

class Duck:
def quack(self):
print "Quaaaaaack!"
def feathers(self):
print "The duck has white and gray feathers."

class Person:
def quack(self):
print "The person imitates a duck."
def feathers(self):
print "The person takes a feather from the ground and shows it."



def in_the_forest(duck):
duck.quack()
duck.feathers()

def game():
donald = Duck()
john = Person()
in_the_forest(donald)
in_the_forest(john)

game()

对象donald也有和对象john一样的quack、feathers方法,对象B也可以实现对象A的功能。 在鸭子类型中,我们关注的不是对象的类型本身(不是class的名称),而是它是如何使用的(class具有的方法)。

我们可以看出,鸭子类型给予Python这样的语言以多态。 但是这种多态的实现完全由程序员来约束强制实现(文档、清晰的代码和测试),并没有语言上的约束(如C++继承和虚函数)。 因此这种方法即灵活,又提高了对程序员的要求。

发表评论