学习python的时候,也知道鸭子类型(ducking typing)这个说法,“当你看到一只鸟走起来像鸭子,游泳起来鸭子,叫起来也像鸭子,那么这只鸟就被称为鸭子类型”,字面上理解了,但是在Python中是如何体验的?这一点还真不太懂。今天在看书,又再次碰到这个玩意,于是决定把这个鸭子类型给整明白。
按照书上的解释,鸭子类型是多态一种形式,这这种形式中,不管对象属于哪个类,也不管声明的具体接口是什么,只要对象实现了相应的方法,函数就可以在对象上执行操作。好吧,这句话如何理解呢?我们开始吧!
简单理解什么是多态?
首先要理解什么是多态,故名思意,多态就是多种状态,不同的对象调用出同一个接口,表现出多种状态。看示例1。
#示例1
class Animal():
def who(self):
print("I am an Animal")
class Duck(Animal):
def who(self):
print("I am a duck")
class Dog(Animal):
def who(self):
print("I am a dog")
class Cat(Animal):
def who(self):
print("I am a cat")
if __name__ == "__main__":
duck=Duck()
dog=Dog()
cat=Cat()
duck.who()
dog.who()
cat.who()
在示例1中,我们定义了duck,dog和cat三个对象,每个对象都实现了who()方法。你看,他们的接口名称都是相同的,他们分别调用who()方法,但有有不同的输出,不同的表现。以下是输出结果:
I am a duck
I am a dog
I am a cat
好了,多态大概就是这么回事了。更详细的解释留在以后的文章吧!
鸭子类型
其实一般不会像上面那样去使用多态,更加优雅的写法见示例2。
#示例2
#此处省略Animal,Duck,Dog,cat的实现
def func(obj):
obj.who()
if __name__ == "__main__":
duck=Duck()
dog=Dog()
cat=Cat()
func(duck)
func(dog)
func(cat)
示例2中定义一个函数func(),这个函数对参数有一个要求,那就是参数必须有who()这个方法。不管你是什么对象,是duck对象也好,是dog对象也罢,只管对象实现who()方法就可。这就是鸭子类型,它根本不管你是什么对象,只要你有这个方法,有这个行为,表现得像鸭子,走起来像鸭子,游泳起来鸭子,叫起来也像鸭子,那么尽管你是一只会飞天的猪,也是称为鸭子类型。
好了,以上就是小编对鸭子类型的理解,如果你有不同的建议,就联系小编一起讨论吧。
欢迎关注公众号:CVpython,一个专注分享Python教程和CV算法的公众号,欢迎来撩
网友评论