鸭子类型
Topic source首先要明确python里“鸭子类型”的概念: 1、看起来像鸭子(举例:一个纸做的手工,参考了鸭子的外形) 2、走起路来像鸭子(这个手工作品,实现了八字走路,而且内置了扬声器可以嘎嘎叫) 总结:那么我们可以认为这个纸工艺品,它就是鸭子。这就是python的灵活之处,不拘泥于静态类型的严格定义,只要这个类型内部有run()函数,可以看作是目标类型。(再做个补充,其实不管是timer类也好,还是其他什么类也好,只要有run()函数,都可以传入到run_twice里运行,因为他们满足run_twice里需要运行run()函数的需要)
并不是Timer类型怎么调用Animal的run(),而是Timer调用自己的run()方法,run_twice里的Animal是个只是个普通的参数,跟Animal类没关系,你可以吧run_twice里的Animal换成任意一个字符试下
class Timer(object):
def run(self):
print('Start...')
def run_twice(animal):
animal.run()
animal.run()
run_twice(Timer())
楼上讲的挺好,这个animal可以看作任意一个类的实例,不管是不是Animal类,只要类中有run()方法就可以调用。
更抽象一点,可以把def run_twice(animal) 中的animal理解成object,如def run_twice(object),object是所有类的父类,任何定义的类都是他的子类,再以多态的概念去理解。
- 1
拜托快给我药这是病得治
最后鸭子类型那看得不是很明白,能不能举个简单的例子,这个Timer类型怎么调用Animal的run()