首页 > 解决方案 > 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'

根据我了解到的 Bonny 应该是 self 参数,那么为什么 self 丢失了?

标签: pythonpolymorphismclass-method

解决方案


您在 . 处缺少一些括号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__但是您还需要使用 OPAnimal使用的函数调用超级(在本例中为对象)的 init 函数。super

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


推荐阅读