Discuss / Python / 鸭子类型是什么意思了?

鸭子类型是什么意思了?

Topic source

没看懂,能调用run方法的对象不都是类本身就定义了run方法么,那下面的话是什么意思?

svcasvawe

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

意思是,无论是否来自同一个继承树,只要含有run方法的类都能被 run_twice(animal)调用

任性Monster

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

run_twice中只是使用到了run方法 假设run_twice中还有animal.eat那传入的time就是错误的因为他没有eat 它看起来不像animal 所以不属于animal类型

任性Monster

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

只要有run方法 我就当这个对象是鸭子类型 当前文章讨论的只是有run方法 不严格的继承树

ColinShi2011

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

其实我觉得这里的 def run_twice(animal)的方法,能够传入类,只要这个类或者他的父类有RUN的方法即可运作。

深入骨头V

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

鸭式辨型来自于:"像鸭子一样走路并且嘎嘎叫的就叫鸭子。"假设有个基类包含三个方法, class duck(object): def run() pass def swim(): pass def walk(): pass 有一个方法依赖这个类。 def testXX(duck): pass 当你真正调用此类的时候你不用管testXX是不是duck或者他的子类,只要这个对象具有run,swim,walk三个方法就认为这个对象是duck类,就可以让他执行,所以方法testXX(duck)实现的时候只需要检查duck是否具有这三个方法就可以了。 def testXX(duck):

#此处检查duck是否具有相应run,swim,walk方法
bol = checkArgsHasMethodSwimWalAndwalk()
if bol:
    return xx
else throw TypeError()

这个就是鸭式辩型的最初理解,这里的意思是 run_twice 也遵循鸭式辩型,不会管实际的类是否是Animal的对象或者它的子类的对象,只要具有run方法,run_twice就能正确执行。 鸭式变形、猴子补丁、map、reduce 这些在很多语言中都有。 廖老师时不时的会提到设计原则,设计原则是软件开发的指导思想比如开闭原则,里氏代换原则,最少知识原则,依赖倒转原则,单一职责原则,接口隔离原则。以及在此基础上开发出的设计模式都最终为一个中心思想服务----代码复用。而继承及函数是除了复制粘帖修改外最最最基础的代码复用。

叫我_小军

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

这样理解: run_twice使用到了run方法, 动态语言是:无论是否来自同一个继承(同一类型),只要含有run方法的类都能被 run_twice(animal)调用,实现run_twice(animal)方法。 静态语言:只能是同一个继承(同一类型),才能被run_twice(animal)调用,实现run_twice(animal)方法。


  • 1

Reply