【问题标题】:Inheritance in classes in Python3Python3类中的继承
【发布时间】:2020-02-18 06:22:11
【问题描述】:

所以 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

这是正确的做法吗?

【问题讨论】:

  • 一般需要在子类构造函数中调用超类构造函数,使用super().__init__优于Entity.__init__

标签: python python-3.x class oop inheritance


【解决方案1】:

正如@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

这样,当Player 创建时,您可以将所有参数传入:

mana = 100
name = "bob"
health = 1000
des = "potato"
player = Player(mana, name, health, des)

在开头添加新参数的模式确实很奇怪。

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

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

然后播放器可以初始化:

mana = 100
name = "bob"
health = 1000
des = "potato"
player = Player(mana=mana, name=name, health=health, des=des)

【讨论】:

  • @MilesKent 如果此答案解决了您的问题,请使用绿色复选标记进行标记。它会将其标记为已解决,这是感谢答案作者抽出时间的好方法。我的建议是坚持使用关键字参数版本。
猜你喜欢
  • 2018-08-13
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 2021-02-21
  • 2018-04-26
相关资源
最近更新 更多