Python3 类中的继承

Mil*_*ent 0 python oop inheritance class python-3.x

所以 Player 类继承了 Entity 类的特性,但也有自己独特的特性,这些特性在 Player 类中初始化。

class Entity(object):
    def __init__(self, name, health, des):
        self.name = name
        self.health = health
        self.des = des
class Player(Entity):
    def __init__(self, mana):
        self.mana = mana
Run Code Online (Sandbox Code Playgroud)

这是执行此操作的正确方法吗?

Sim*_*nJM 5

正如@juanpa.arrivillaga 指出的那样,您可能想要调用超类构造函数。的方式__init__职能的工作,目前还没有办法通过构造函数传递参数下来。

另一种方法是:

class Entity(object):
    def __init__(self, name, health, des):
        self.name = name
        self.health = health
        self.des = des

class Player(Entity):
    def __init__(self, mana, *args):
        super().__init__(*args)
        self.mana = mana
Run Code Online (Sandbox Code Playgroud)

这样,在Player创建时,您可以传递所有参数:

mana = 100
name = "bob"
health = 1000
des = "potato"
player = Player(mana, name, health, des)
Run Code Online (Sandbox Code Playgroud)

它确实具有将新参数添加到开头的奇怪模式。

另一种方法是只使用关键字参数(拥有*本身意味着任何非关键字参数都会被吞下)

class Entity(object):
    def __init__(self, *, name, health, des):
        self.name = name
        self.health = health
        self.des = des

class Player(Entity):
    def __init__(self, *, mana, **kwargs):
        super().__init__(**kwargs)
        self.mana = mana
Run Code Online (Sandbox Code Playgroud)

然后播放器可以初始化为:

mana = 100
name = "bob"
health = 1000
des = "potato"
player = Player(mana=mana, name=name, health=health, des=des)
Run Code Online (Sandbox Code Playgroud)