我正在通过一个项目学习Python,并且遇到了子类化的问题。根据我读过的所有内容,这个过程非常简单,但是从子类调用基类中的方法会导致属性找不到错误。
我的代码示例包括基类(Player),子类(Roster)的相关部分以及对基类和子类的设置和调用。我错过了什么?如果真的不需要在子类中创建 init 方法吗?
主脚本:
from battleship.player import Player, Roster
player=Player()
roster=Roster()
player.register()
roster.load_other_players()
类:
class Player:
def __init__(self):
....
self.getOtherPlayers = {}
def register(self):
...
return
def get_other_players (self):
return self.getOtherPlayers
def gameFlow(self):
if self.currentFlow != undefined:
self.currentFlow+=1
else:
self.currentFlow = 0
def setMove(self, m):
return move.setMove(m);
class Roster(Player):
def __init__(self):
super().__init__()
def load_other_players(self):
print("Roster!!!")
print("Other players: ", super.get_other_players())
返回:
Roster!!!
Traceback (most recent call last):
File "player.py", line 23, in <module>
roster.load_other_players()
File "/home/jspooner/projects/battleship/BotPlayer/battleship/player.py", line 152, in load_other_players
print("Other players: ", super.get_other_players())
AttributeError: type object 'super' has no attribute 'get_other_players'
修改 如果有人在将来引用这个问题我的实际问题是一个设计问题,我创建了基类的实例以及子类的实例。结果我有2个相关类的实例彼此没有联系。
为了解决这个问题,我交换了层次结构,以便Roster是父类,而Player是子类。我的 main 创建了一个Player实例,它自然地创建了一个相关的Roster类。
答案 0 :(得分:2)
解决您的主要问题:
super
不是有效实体,它是函数super()
。或者,由于Roster
继承自Player
,self.get_other_players()
也是一种可接受的引用方式,因为所有超类的属性都被合并为子类。
__init__
,但如果要执行某些初始化,则必须这样做。值得一读THIS答案,以获得有关__init__
实际发生情况的更深入信息以及为什么有必要。
回答一个你没有提出的问题:Python在某些方面与其他语言不同,最值得注意的是,getter和setter的使用并不是必需的。而不是super().get_other_players()
或等效,只需直接访问getOtherPlayers
属性。它更优雅,可以减少代码行数,并且在您维护代码时更容易阅读/调试(它更多&#39; pythonic&#39;)
答案 1 :(得分:1)
这很容易,你忘记了超级的()。您应该像这样调用函数:super().get_other_players()
而不是super.get_other_players()
,因为super是一个函数。
此外,如果您不需要,在子类中使用构造函数(在子类中定义__init__()
方法)是绝对不可靠的。