问题
Topic source有个疑惑,为什么 这里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
首先现在class内外都可以,python的官方文档说了self变量的命名没有强制性,你把他改成animal也没问题,只是降低了可读性
如果在class内定义的run_twice方法,那就只有和Animal类或继承关系的类才能调用这个方法啊,那就不是鸭子对象了,因为Dog和Cat是真鸭子啊
如果写在外面,就是个普通的函数呗,animal就是个形参名,不是真鸭子还是鸭子对象,只要有run方法就可以塞进来
具体写在内部还是外部看情况咯,就像你只拿到了一个别人的api接口,你怎么写到别人的class里面去?
最后的这句这倒是提醒了我并加深了我的理解(多谢大佬):因为我是带着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()自然可用。
当冇If
没错!