找不到Python 3继承属性

时间:2018-03-17 13:24:25

标签: python-3.x subclassing

我正在通过一个项目学习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类。

2 个答案:

答案 0 :(得分:2)

解决您的主要问题: super不是有效实体,它是函数super()。或者,由于Roster继承自Playerself.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__()方法)是绝对不可靠的。