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
的类,但第二行是class
Animal
的对象。因此,如果要创建类的对象,必须初始化该类(与第二种形式相同)。 您的正确代码如下所示:

类动物:
def谈话(自我,某事):
打印(某物)
犬类(动物):
def对话(自我):
超级对话(“汪汪汪”)
邦尼=狗
邦尼,说话

此外,根据标准,对象的名称应使用小写。

我的IDE提供了一个提示:方法“Dog.talk()”的签名与类“Animal”中基方法的签名不匹配。此外,请尝试执行
print(type(Dog),type(Dog())
。这个例子总的来说有点奇怪。
Bonny=Dog()
来实例化对象。
bonny = Dog()