请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请老师看看我对鸭子类型和多态的理解是否正确。

烦请老师看看我以下的理解是否对:

一、有关鸭子类型与魔法方法:

    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中就必须要继承某个类或者接口才行

1 回复 有任何疑惑可以回复我~
  • 提问者 Jazz_Qi #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-08-22 18:06:29
慕码人5330596 2018-10-03 05:54:59

总结得真的很好啊。我的想法如下:


多态:同一种函数调用,可以有多种主体。那么就可以呈现多态。


鸭子类型:多态是目的(因为实现了多态,代码就有更高的灵活度),鸭子类型就是多态成立的前提。所谓鸭子类型,就是关注class中的魔法函数,由魔法函数来定义class的数据类型,而数据类型就决定了该class可以如何被使用。在python中,数据类型是由魔法函数决定,而没有向java一样,由继承之类的写死。

0 回复 有任何疑惑可以回复我~
  • bobby #1
    理解很到位
    回复 有任何疑惑可以回复我~ 2018-10-04 12:20:57
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信