Discuss / Python / 问题

问题

Topic source

当冇If

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

没错!

金钟铉

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

@拉钩上吊一百年不许变丶

写里面,传入的数据类型就固定是Animal,和鸭子类型不符

mf734

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

因为这里的animal不是指Animal那个class,只是一个输入而已。你想的话,还可以改成cccccxxx。这个函数接收的时候来者不拒,运行的时候只要复合里面的方法就直接运行过去了。

有个疑惑,为什么 这里class内的函数第一个参数不是self而可以直接用animal,我尝试第一个参数用self反而出错了?

class Cat():    def run(self):        print('cat is running')    def run_twice(self,Cat):        Cat.run()        Cat.run()
a=Cat()
a.run_twice()

TypeError: run_twice() missing 1 required positional argument: 'Cat'

有没有大神解答一哈TT

LZY教主

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

首先现在class内外都可以,python的官方文档说了self变量的命名没有强制性,你把他改成animal也没问题,只是降低了可读性

如果在class内定义的run_twice方法,那就只有和Animal类或继承关系的类才能调用这个方法啊,那就不是鸭子对象了,因为Dog和Cat是真鸭子啊

如果写在外面,就是个普通的函数呗,animal就是个形参名,不是真鸭子还是鸭子对象,只要有run方法就可以塞进来

具体写在内部还是外部看情况咯,就像你只拿到了一个别人的api接口,你怎么写到别人的class里面去?

4L正解,“鸭子类型”的原因是动态语言中一个函数在定义时,变量不用指定类型且可以为任意类型(取决于你传入的参数的类型),所以函数只要能运行就行,不用管传入的类型。

520bv

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

最后的这句这倒是提醒了我并加深了我的理解(多谢大佬):因为我是带着c/c++基础过来的,python和它们的确有这方面的区别,python的变量没有硬性要求是什么类型而是任意类型,当赋值后才有的数据类型,比如你定义变量a,当a=5后a就是个整型类型了。所以,这里以为Animal,Dog,Cat都有run方法,并且Dog,Cat都是Animal的子类,也就是说即使Dog,Cat没有run这个方法,run_twice(Dog/Cat)仍然可以执行,只是执行效果不同罢了。当你定义一个Fish,并赋值Fish=Animal(),此时Fish的数据类型就是Animal了,Fish.run_twice()自然可用。


Reply