Discuss / Python / 疑问

疑问

Topic source

黄艳fly

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

看了两遍,还是不理解,run_twice(animal)函数跟Animal类跟继承有什么关系,这不就是个普通函数,调用传入参数的run()方法吗?新增一个Animal的子类,跟run_twice()有什么关系,肯定不需要修改呀

def run_twice(animal):
    animal.run()
    animal.run()
class  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类型,应该是实现比较复杂吧。

master_Hang

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

确实,作者的这一点表达逻辑没做好。 run_twice(animal)其实就是一个接口函数,可以用来接收一个对象,不管什么类型的对象都能接受,并且只要这个对象有run()都可以输出。作者想表达的意思应该是多态,如果传进去的对象自身没有定义run(),就会调用基类的run(),如果子对象有run(),就会调用自身的run(),也就实现了多态。但是所说的鸭子什么的,也就是只要传进去的是一个对象,并且该对象有run(),就可以体现出run()的特性。

4楼说的很清晰,懂了

shhdht

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

所以在这里我做笔记的时候,干脆把 run_twice 写成了 Animal 的 类函数,Dog() 可以调用父类的类函数,而里面的run()是调用自身的。感觉更能体现作者想表达的多态的含义,否则 run_twice() 这里和 Animal 着实没多大关系。

Skeleton

#7 Created at ... [Delete] [Delete and Lock User]
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()

感觉这样更好理解多态的含义。但是鸭子类型着实没理解。。。

Zzy

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

run不是普通的方法,是多线程里面的。按道理应该是拿多线程举例的,只有类实现run方法,才能使用实例的start方法,开始多线程。

其实鸭子更应该叫做协议。比如生成器协议,只要类实现了生成器协议,就可以使用for循环。

On1on

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

master_Hang说的好

ㅍ_ㅍ

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

其实这里这个例子没毛病, 只是缺少和其他语言的对比, 就比如java和c++, 在参数列表里必须是父类或者子类类型, python作为动态语言在内部逻辑上很大一部分方便了程序员编写代码


  • 1

Reply