请老师看看我对鸭子类型和多态的理解是否正确。
来源:4-1 鸭子类型和多态

Jazz_Qi
2018-08-08
烦请老师看看我以下的理解是否对:
一、有关鸭子类型与魔法方法:
1、我们自定义任何的class(不使用“类”,以免与“类型”混乱)一般情况下其实与list、set都拥有一样基类object,那么我自定义的类之间,甚至与python中list、set等内置类的区别往往就在于彼此用了何种魔法函数,因为魔法函数会使得所在的class(类)拥有某种特性,而我们往往根据其拥有的特性将class(类)分为不同的“类型”,如:数值、迭代类型、序列类型等等。而这个用于分类的“类型”是否用“数据类型”这个词代替会更好,更不容易搞混乱?
2、由于魔法方法能够使得一个class(类)拥有某种特性从而变成为某种数据类型,所以class(类)的名称是不重要的,重要的是这个class(类)有何种特性,从而属于何种数据类型。
3、老师你鸭子类型中举的for循环调用同一方法的例子中并没有使用魔法方法,但其实也说明了只要某个对象拥有某个方法就可以被调用,我们更喜欢说某个类有duck方法(它有鸭的脖子),而不是因为它是鸭子类所以有duck方法。
终上所述,我理解的鸭子类型其实就是利用有什么特性,属于什么数据类型,有什么魔法函数来分类,来操作的思维,而不管这些class(类)或对象的名称叫什么。
二、多态:
由于本人不是计算机专业,只因为工作学习过vba与python,也不懂静态与动态语言的区别,我只知道我用vba的时候是其实就是写操作过程。我对python的不同class(类)的实例对象可以调用同一个方法觉得天经地义,完全不明白老师所说的java的类比方法重要的思维。
1、我猜想是不是java中自定义方法时形参需要事先定好数据类型,假如自定义一个A方法时形参明白地指定了是A类,那么运行A方法的时候传入的实参只可以是A类或A类的子类,不然会报错。但python重点不在往A参数传入什么参数,而是这个参数所拥有的特性是否在是A方法里面要调用的特性(数据类型)相一致。
三、鸭子类型和多态:
1、其实鸭子类型和多态是python的一个特点的不同面向的描述或这个特点的两种体现,这个特点是:python更看重数据类型以及其特性的操作而不是编程形式/格式,所以python拥有更高的灵活性。
老师,请问如上理解有没有问题?
2回答
-
你的理解非常到位, 因为你没有学习过静态语言如c++和java,所以没有受到经验语言的影响, 不然理解起来就费劲了, java中确定一个类型是更具类名或者接口来的, 但是严格意义上来讲, java的要求更严格 比如一个类只能继承一个类, 比如我要定义一个动物类 我就必须要继承动物类才行, 我要让我的一个对象可以用 == 操作符 我必须要继承一个接口, 在python中就很简单 你只要定义方法名就行了, java中就必须要继承某个类或者接口才行
112018-08-22 -
慕码人5330596
2018-10-03
总结得真的很好啊。我的想法如下:
多态:同一种函数调用,可以有多种主体。那么就可以呈现多态。
鸭子类型:多态是目的(因为实现了多态,代码就有更高的灵活度),鸭子类型就是多态成立的前提。所谓鸭子类型,就是关注class中的魔法函数,由魔法函数来定义class的数据类型,而数据类型就决定了该class可以如何被使用。在python中,数据类型是由魔法函数决定,而没有向java一样,由继承之类的写死。
012018-10-04
相似问题