animal只是一个形参而已,在函数头 def run_twice(animal) 上,本身并没有类型
它只是告诉计算机,函数run_twice需要一个参数,而这个参数具体需要什么样的,是整数类型还是字符串又或者函数,需要看具体引用,也就是run_twice函数中的如何引用annimal
animal.run()告诉计算,animal调用了它中的run函数,所以annimal必须是一个类或类对象,(只有类才能调用它中的函数,函数并不能用 函数名.函数名() 的方式调用它的内嵌函数)
而且这个类/类对象中必须有一个run函数,它才能调用run。
所以计算机知道animal是一个包含run函数的类。
而至于这个类具体是什么,是Animal还是Animal的子类Dog或者另一个类Timer
这都无所谓。
其实在函数run_twice的作用是调用某个类中的函数run,你传入不同的类,每次调用的是这次传入的类中的run,这个run函数并不是同一个
鸭子类型:现在把 类Animal当做鸭子, 把调用run函数当做鸭子的走路姿势
只要这个类可以调用run函数,就把它看做鸭子
也就是说走路姿势像鸭子,你就是鸭子
到位
Sign in to make a reply
一盒噪噪
animal只是一个形参而已,在函数头 def run_twice(animal) 上,本身并没有类型
它只是告诉计算机,函数run_twice需要一个参数,而这个参数具体需要什么样的,是整数类型还是字符串又或者函数,需要看具体引用,也就是run_twice函数中的如何引用annimal
animal.run()告诉计算,animal调用了它中的run函数,所以annimal必须是一个类或类对象,(只有类才能调用它中的函数,函数并不能用 函数名.函数名() 的方式调用它的内嵌函数)
而且这个类/类对象中必须有一个run函数,它才能调用run。
所以计算机知道animal是一个包含run函数的类。
而至于这个类具体是什么,是Animal还是Animal的子类Dog或者另一个类Timer
这都无所谓。
其实在函数run_twice的作用是调用某个类中的函数run,你传入不同的类,每次调用的是这次传入的类中的run,这个run函数并不是同一个
鸭子类型:现在把 类Animal当做鸭子, 把调用run函数当做鸭子的走路姿势
只要这个类可以调用run函数,就把它看做鸭子
也就是说走路姿势像鸭子,你就是鸭子