疑问
Topic sourceclass Animal(object) :
def run(self) :
print("Animal is run...")
def eat(self) :
print("Animal is eating...")
class Dog(Animal):
def run(self) :
print("dog is run...")
class Cat(Animal):
def run(self) :
print("cat is run...")
def run_eat(Animal) :
Animal.eat()
Animal.run()
animal = Animal()
dog = Dog()
cat = Cat()
run_eat(animal)
run_eat(dog)
run_eat(cat)
如果这样写,再增加一个Animal
的子类你就明白了
是的,run_twice(x)函数确实和Animal类和继承无关,但是这里想表达的意思应该是假如变量x被限制为Animal类型的情况,至于为什么没被限制为Animal类型,应该是实现比较复杂吧。
确实,作者的这一点表达逻辑没做好。 run_twice(animal)其实就是一个接口函数,可以用来接收一个对象,不管什么类型的对象都能接受,并且只要这个对象有run()都可以输出。作者想表达的意思应该是多态,如果传进去的对象自身没有定义run(),就会调用基类的run(),如果子对象有run(),就会调用自身的run(),也就实现了多态。但是所说的鸭子什么的,也就是只要传进去的是一个对象,并且该对象有run(),就可以体现出run()的特性。
所以在这里我做笔记的时候,干脆把 run_twice 写成了 Animal 的 类函数,Dog() 可以调用父类的类函数,而里面的run()是调用自身的。感觉更能体现作者想表达的多态的含义,否则 run_twice() 这里和 Animal 着实没多大关系。
class Animal(object):
def __init__(self, name):
self.__name = name
def run(self):
print('%s is running' % self.__name)
def run_twice(self):
self.run()
self.run()
class Dog(Animal):
pass
class Cat(Animal):
pass
class Tortoise(Animal):
def run(self):
print('Tortoise is running slowly...')
dog = Dog('Dog')
cat = Cat('Cat')
tortoise = Tortoise('Tortoise')
dog.run_twice()
cat.run_twice()
tortoise.run_twice()
感觉这样更好理解多态的含义。但是鸭子类型着实没理解。。。
run不是普通的方法,是多线程里面的。按道理应该是拿多线程举例的,只有类实现run方法,才能使用实例的start方法,开始多线程。
其实鸭子更应该叫做协议。比如生成器协议,只要类实现了生成器协议,就可以使用for循环。
- 1
黄艳fly
看了两遍,还是不理解,run_twice(animal)函数跟Animal类跟继承有什么关系,这不就是个普通函数,调用传入参数的run()方法吗?新增一个
Animal
的子类,跟run_twice()
有什么关系,肯定不需要修改呀