在子类的__init__中设置超类的属性

0 投票
1 回答
2152 浏览
提问于 2025-04-16 10:41

我遇到一个问题,需要一个自定义的获取器和一个普通的设置器。问题出现在我尝试在子类的 __init__ 方法中设置属性时。如果我把 super__init__ 放在最后,它会覆盖 Child 类中的设置。

显然,如果先运行 super__init__,就能解决这个问题。我在 Parent 类的 setx 方法中加了一个 assert,以确保 _x 已经被初始化。

我想知道我是不是做错了什么。把 assert 放在设置器里让我觉得有点别扭。

注意:我之前没有在初始化时初始化 _x,直到 pylint 提醒我。

class Parent(object):

  def __init__(self):
    self._x = None

  def getx(self):
      return self._x

  def setx(self, value):
      #assert hasattr(self,'_x')
      self._x = value

  x = property(getx, setx)

class Child(Parent):

  def __init__(self, x):
      self.x = x
      super(Child, self).__init__() # sets x to None

if __name__ == '__main__':
  p = Parent()
  p.x = 123
  print p.x # prints 123

  c = Child(321)
  print c.x #prints None

1 个回答

4

我个人更喜欢下面这个解决方案:

class Parent(object):
    def __init__(self, x=None):
        self._x = x

class Child(Parent):
    def __init__(self, x):
        super(Child, self).__init__(x)

撰写回答