Python类多态性

2024-03-29 09:04:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在练习多态性,下面的代码返回错误

class Animal:
    def talk(self, something):
        print(something)

class Dog(Animal):
    def talk(self):
        super().talk("woof woof")

Bonny = Dog
Bonny.talk()
TypeError: talk() missing 1 required positional argument: 'self'

根据我所学到的,邦尼应该是自我论证者,那么为什么自我会缺失呢


Tags: 代码selfdef错误somethingclasstalkprint
2条回答

您没有初始化对象,只是创建了名为BonnyDog类的副本。通过打印它们,您可以看到Dog()Dog之间的区别

class Animal():
    
    pass

print(Animal)   # the result is <class '__main__.Animal'>

print(Animal()) # the result is <__main__.Animal object at 0x037D6A50> 

第一行是指一个名为Animal的类,但第二行是类Animal的对象。因此,如果要创建类的对象,必须初始化该类(与第二种形式相同)。 您的正确代码如下所示:

class Animal:
    def talk(self, something):
        print(something)

class Dog(Animal):
    def talk(self):
        super().talk("woof woof")

bonny = Dog()
bonny.talk()

根据Python Style Guide的规定,用小写字母命名对象是标准的

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类的引用。它是可调用的,并且将调用Dog的实例Bonny将不是一个类型

Bonny = Dog()

如果您想像上面那样调用对象,应该添加括号。这意味着您调用对象并引用它Bonny将作为参考

对对象的引用也应该是小写的

bonny = Dog()

第二件事。由于您的对象表明它们可能包含对应于相同类型的每个对象(2个或多个Dog对象)的数据,因此需要一个constructor

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

这样你可以给你的狗命名,让它说出自己的名字,然后在print(bonny)上,也可以用__str__方法打印它的名字。但是您还需要使用OP使用的super函数调用super的(在本例中是Animal对象)init函数

类继承在Python中不是最简单的事情,因为它不是一种强OO语言。但是课程太棒了

相关问题 更多 >