请稍等 ...
×

采纳答案成功!

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

关于鸭子类和多态的疑问

1)老师描述鸭子类型的这就话,还是不太理解“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

我个人的理解是,就是一个对象obejct  

2)能不能说Python中是没有多态的,因为从老师的代码中三个类,多有相同的方法,for循环遍历,调用它,我的理解这不是多态把

正在回答

2回答

  1. 鸭子类型的最直观理解,我觉得是,如果一个类实现了某些特定的方法的方法,它就可以被认为是这一个类的一种。最基本的用法就是你在函数调用传参的时候定义的参数是一个类,函数执行过程中使用了这个类的某一种方法,如果你另外编写了一个类,也实现了这个方法,那么这个函数调用这个新类也没有问题。

  2. Python是有多态的。不然你怎么在子类里重写或者不重写父类的方法。。

0 回复 有任何疑惑可以回复我~
  • 提问者 菠萝吹雪gz #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-07-16 10:40:20
bobby 2018-07-18 15:21:48

不务正业的码农 同学说的鸭子类型是基本上正确的, 但是多态的理解上有点不太准确:

  1. 类型这个概念在静态语言中很常见,比如java中,我定义了class Dog 那dog其实就是一个类型,而且这个dog类型中有哪些方法是固定的,比如buck这个方法,这里要搞懂, 是buck这个方法放到dog类里面才使得这个方法有意义,这个方法你放到Pig类里面, pig类还是pig类,这里方法叫什么名字本身不重要,而类名才是最重要的。但是鸭子类型不一样,一个类的类名不重要,重要的是类中有哪些方法名,所以这里方法名就很重要了,比如一个类中有__iter__这个方法,那这个类就是一个可迭代类。如果dog实现了__iter__这个方法,那dog就是一个可迭代类,pig如果也实现了__iter__这个方法说明pig也是一个可迭代类,所有这里最重要的是方法名,方法名是固定的,当时你也可以自己去定义一套协议,比如你把所有实现了quark这个方法的类都是禽家类,所以这里你的类可以不用去继承任何类,你只要实现这个方法就是同一类型,java中必须大家都继承同一个类才能叫做家禽类。这个就是根本的区别,一个以继承关系为主(java),一个以实现的方法名为主

  2. 多态这个概念很多人都喜欢拿来对比,其实这个概念在python中可以不存在,在java这种静态语言中 一个类在实例化的时候才能知道具体是实现什么子类的情况下,我们最开始将这个类指向其父类,等到具体的时候再指向实际的子类,这种情况下叫多态,但是python是动态语言,在任何都是都可以改变其指向的类型。天然就是多态,所以多态这个概念是大家强行将静态语言的概念拿到动态语言中来理解的概念。

4 回复 有任何疑惑可以回复我~
  • 提问者 菠萝吹雪gz #1
    谢谢老师的解答,唉,我就是拿静态语言中的多态来理解Python中的多态
    回复 有任何疑惑可以回复我~ 2018-07-18 18:42:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信