Python类多态性
我正在练习多态性,下面的代码返回错误Python类多态性,python,polymorphism,class-method,Python,Polymorphism,Class Method,我正在练习多态性,下面的代码返回错误 class Animal: def talk(self, something): print(something) class Dog(Animal): def talk(self): super().talk("woof woof") Bonny = Dog Bonny.talk() 根据我所了解的,Bonny应该是self,那么为什么self会丢失呢?您在Bonny=Dog中缺少了
class Animal:
def talk(self, something):
print(something)
class Dog(Animal):
def talk(self):
super().talk("woof woof")
Bonny = Dog
Bonny.talk()
根据我所了解的,Bonny应该是self,那么为什么self会丢失呢?您在
Bonny=Dog
中缺少了一些括号
class Animal:
def talk(self, something):
print(something)
class Dog(Animal):
def talk(self):
super().talk("woof woof")
Bonny = Dog()
Bonny.talk()
编辑
由于这是我目前投票最多的答案,仍然有一些活动,而且显然缺乏一些解释,我想补充一些
Bonny = Dog
意思是说,Bonny
是对Dog
类的引用。它是可调用的,并且将调用狗的实例Bonny
将不是一种类型
Bonny = Dog()
如果您想像上面那样调用对象,应该添加括号。这意味着您调用对象并引用它<代码>邦尼
将作为参考
对对象的引用也应该是小写的
bonny = Dog()
第二件事。由于您的对象表明它们可能包含与相同类型的每个对象(2个或更多狗对象)对应的数据,因此需要一个构造函数
class Dog(Animal):
def __init__(self, name):
super(Dog, self).__init__(self)
self.name = name
def talk(self):
super().talk("woof woof my name is {}".format(self.name))
def __str__(self):
return self.name
这样你就可以给你的狗命名,让它说出自己的名字,然后在打印(bonny)
上,也可以使用\uuu str\uu
方法打印它的名字。但是您还需要使用OP使用的super
函数调用super(在本例中为Animal
objects)init函数
类继承在Python中不是最简单的事情,因为它不是一种强OO语言。但是课程太棒了 您没有初始化对象,只是创建了名为Bonny
的Dog
类的副本。通过打印它们,您可以看到Dog()
和Dog
之间的区别
class Animal():
通过
打印(动物)#结果是
打印(动物())#结果是
第一行是指名为Animal
的类,但第二行是classAnimal
的对象。因此,如果要创建类的对象,必须初始化该类(与第二种形式相同)。
您的正确代码如下所示:
类动物:
def谈话(自我,某事):
打印(某物)
犬类(动物):
def对话(自我):
超级对话(“汪汪汪”)
邦尼=狗
邦尼,说话
此外,根据标准,对象的名称应使用小写。我的IDE提供了一个提示:方法“Dog.talk()”的签名与类“Animal”中基方法的签名不匹配。此外,请尝试执行print(type(Dog),type(Dog())
。这个例子总的来说有点奇怪。Bonny=Dog()
来实例化对象。
bonny = Dog()