Discuss / Python / 问题

问题

Topic source

赞同!

@左手天才T "为什么是def run_twice(animal) 而不是 def run_twice(Animal) 我搞不懂"---- 只要三者一致,你想怎么定义都行。

槲寄君

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

楼上的楼上表述的有误吧,写在外面实际上只体现了鸭子特性,继承是要继承父类的所有方法的,鸭子特性只是当前类中正好有一个方法和某个类一样而已,并不是说明它还继承了那个类的其他所有方法,你写个代码测试一下就知道鸭子类型和继承的区别,不能误导别人哦

Limckoss

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

def twice_run(aaa): aaa.run()

twice_run(Animal()) twice_run(Dog()) twice_run(Cat())

这里的定义的run_twice(animal)只是一个普通的函数。animal只是一个形参,你甚至可以写成x。而实参只要有run函数就正常运行,没有run函数就会报错。

火火陆柒

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

def run_twice(animal): animal.run() animal.run()

老师这节讲鸭子特性的重点我的觉得是:

Python的参数不必定义类型(与Java等静态语言的不同点)

run_twice函数的参数animal没有类型限制,如果是用Java写,这个函数会变成:

  public void run_twice(Animal animal) {  
      ////
  }

Python的鸭子特点就是指的参数animal可接收一切类型的实例,只要这个实例有run方法。

个人理解,欢迎指正。

run_twice写在类里面,第三个没有继承Animald的类是无法调用的

upbeat_peach

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

为什么是def run_twice(animal) 而不是 def run_twice(Animal) 我搞不懂

+1

还有一个问题为什么里面是animal而不是self了o(╥﹏╥)o

雨后那谁

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

run_twice()写在类内就是继承,只有Animal和Animal的子类可以运行run_twice(),由于Timer类不是Animal的子类,无法运行run_twice()方法。 run_twice()写在类外,由于动态语言的鸭子特性,只要类中有run()方法都可以正常运行run_twice()方法。

GOGOGO-枼子

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

赞同“南柯一梦”,解答了,之前没有明白这鸭子特性。


Reply