如何解决重写方法引起的AttributeError

How to solve AttributeError caused by overriden method

当我重写子类中访问该子类中引入的属性的方法时,我试图找出出现属性错误的原因。

在下面的代码中您可以看到 B 工作正常,但仅当我在 C.

中的重写方法中引用新属性时才会出现错误

我以为我可能不得不再次调用 populate 方法,但事实并非如此。

# some class that uses a method to populate one of it's attributes
class A:
    def __init__(self):
        self.populate()

    # The original populating method
    def populate(self):
        self.x = 5

my_obj = A()
print(my_obj.x)

# I can make a subclass that works fine AND has a new attribute
class B(A):
    def __init__(self):
        super().__init__()
        self.y = 9

    def populate(self):
        self.x = 5

my_obj = B()
print(my_obj.x)
print(my_obj.y)


class C(A):
    def __init__(self):
        super().__init__()
        self.z = 7
        self.populate()

    # This method overides the original one and causes an attribute error
    # because self.z is unknown
    def populate(self):
        self.x = self.z

my_obj = C()
print(my_obj.x)

问题是您在初始化对象 C 时需要属性 x。在 A.__init__ 中,对 self.populate() 的调用已经是最重要的方法,即 C.populate 并且它需要 self.x.

可以在调用父类的__init__方法之前设置self.z

class C(A):
    def __init__(self):
        self.z = 7
        super().__init__()

    def populate(self):
        self.x = self.z