Python 类多态性

הרא*_*ונה 0 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()
Run Code Online (Sandbox Code Playgroud)
TypeError: talk() missing 1 required positional argument: 'self'
Run Code Online (Sandbox Code Playgroud)

根据我学到的,邦尼应该是自我论证,所以为什么自我缺失?

nag*_*gyl 6

您在Bonny = Dog.处缺少一些括号。

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

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

Bonny = Dog()
Bonny.talk()
Run Code Online (Sandbox Code Playgroud)

编辑

由于这是我目前投票最高的答案,并且仍然有一些活动,并且显然缺乏一些解释,我想补充一些。

Bonny = Dog
Run Code Online (Sandbox Code Playgroud)

手段,Bonny是对Dog类的引用。它是可调用的,并且Dog. Bonny不会是一种类型。

Bonny = Dog()
Run Code Online (Sandbox Code Playgroud)

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

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

bonny = Dog()
Run Code Online (Sandbox Code Playgroud)

第二件事。由于您的对象表明它们可能包含与每个相同类型的对象(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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以为您的狗命名,让他说出他的名字,然后print(bonny)还可以使用该__str__方法打印他的名字。但您还需要使用 OPAnimal使用的super函数调用超级(在本例中为对象)的 init 函数。

类继承在 Python 中并不是最简单的事情,因为它不是一种强面向对象的语言。但是课程很棒!