python - 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 丢失了?
解决方案
您在 . 处缺少一些括号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 语言。但是课堂很棒!
推荐阅读
- javascript - 如何使用 VUE 为课程添加条件
- xcode - Can you change info.plist inside a Run Script in Xcode's Build Phase?
- c - 分配基地址的指针数组给出错误
- python - 如何使用 API 从 Google 电子表格导出二进制图像?
- ios - iPhone 上的谷歌地图看起来与安卓不同
- java - 凯撒密码,为每个循环移动字符
- angular - Angular Google Map 发送 Plus 代码而不是地址
- c++ - 如何在 Visual Studio 中调试优化的 C++ 代码
- android - 如何将 Android Auto 模块与手机应用程序模块结合起来?
- spring - 如何在 JpaRepository(CrudRepository) 中实现方法