如何解决重写方法引起的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
当我重写子类中访问该子类中引入的属性的方法时,我试图找出出现属性错误的原因。
在下面的代码中您可以看到 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