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

问题描述 投票:3回答:1

当我覆盖访问该子类中引入的属性的子类中的方法时,我试图找到导致属性错误的原因。

在下面的代码中,您可以看到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)
python methods override super attributeerror
1个回答
3
投票

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

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

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

    def populate(self):
        self.x = self.z
© www.soinside.com 2019 - 2024. All rights reserved.