Discuss / Python / 鸭子类型

鸭子类型

Topic source

最后鸭子类型那看得不是很明白,能不能举个简单的例子,这个Timer类型怎么调用Animal的run()

Velskerd

#2 Created at ... [Delete] [Delete and Lock User]

首先要明确python里“鸭子类型”的概念: 1、看起来像鸭子(举例:一个纸做的手工,参考了鸭子的外形) 2、走起路来像鸭子(这个手工作品,实现了八字走路,而且内置了扬声器可以嘎嘎叫) 总结:那么我们可以认为这个纸工艺品,它就是鸭子。这就是python的灵活之处,不拘泥于静态类型的严格定义,只要这个类型内部有run()函数,可以看作是目标类型。(再做个补充,其实不管是timer类也好,还是其他什么类也好,只要有run()函数,都可以传入到run_twice里运行,因为他们满足run_twice里需要运行run()函数的需要)

并不是Timer类型怎么调用Animal的run(),而是Timer调用自己的run()方法,run_twice里的Animal是个只是个普通的参数,跟Animal类没关系,你可以吧run_twice里的Animal换成任意一个字符试下

coLBooy

#4 Created at ... [Delete] [Delete and Lock User]

class Timer(object):

    def run(self):

        print('Start...')

def run_twice(animal):

    animal.run()

    animal.run()

run_twice(Timer())

楼上讲的挺好,这个animal可以看作任意一个类的实例,不管是不是Animal类,只要类中有run()方法就可以调用。

Roger_R36

#5 Created at ... [Delete] [Delete and Lock User]

更抽象一点,可以把def run_twice(animal) 中的animal理解成object,如def run_twice(object),object是所有类的父类,任何定义的类都是他的子类,再以多态的概念去理解。

谢谢大家,今天回头复习,这里想通了,正好看到大家的解答,非常感谢!

最近正好在学复杂系统,看到这个多态的概念觉得好亲切


  • 1

Reply