关于动态类与动态类的实例的区别
Topic source发现根本上是自己的理解有点问题,实际上只要类的名字带上了括号,就已经是一个instance了,只不过run_twice(Timer())没有给这个instance赋予变量名。理解错误。
我是这么理解这个鸭子的 : 对于C++或其他静态语言 run_twice函数在定义时形参的类型就已经确定了 比如上文的Animal类,而调用的时候必须传入Animal类,当传入是Timer类时就会报错。 python由于其动态语言,animal这个变量是可以不限定变量类型的,只要确保他有run这个函数 执行下来就不会报错,这个应该就是所谓的鸭子。
C/C++这样的静态语言定义函数的时候是需要显式地申明参数类型,既然限定了参数类型自然也限定了参数在函数内的行为,因为错误的参数类型在传入的当下就已经被拒绝接受了。
然而python这样的动态语言函数的参数从来都没有明确申明,因此你传入任何类型,python函数都能接住,不过接住以后函数调用的时候发现该参数并没有某行为的话才会抛出异常,因此只要函数内部调用的行为只要传入参数具备就行。
简而言之,静态语言传参错误,是不会进入函数调用阶段;而动态语言是接收后使用参数的过程中发现错误抛出异常。
我也是没搞懂‘鸭子’的含义 def run_twice(animal): animal.run() 这里的animal又不是Animal,他只是一个形参而已,改成其他名字都没问题吧,只要调用的时候传入一个有run方法的实力对象就ok的吧,望不吝赐教
- 1
- 2
Flamsky
发现如下情况