这个程序似乎完成了本书的所有内容,但是这个问题出现了:当一个基类被初始化时,调用了一个在派生类中被覆盖的成员方法,并假设派生类已经被建造。
是否有一些最佳做法可以防止这种情况发生?
.htaccess
这就是错误:
#!/usr/bin/env python3
class A:
def __init__(self):
self.ax = 1
print(self)
def __repr__(self):
return "{} ax: {}".format(self.__class__.__name__, self.ax)
class B(A):
def __init__(self):
super().__init__()
self.bx = 10
def __repr__(self):
return super().__repr__() + " bx: {}".format(self.bx)
if __name__ == "__main__":
B()
答案 0 :(得分:1)
通常,除非你真的知道自己在做什么,否则你需要在完成类所需的所有操作后调用超类初始化。与此示例相同, repr 正在尝试在初始化之前打印self.bx。如果你这样做
class B(A): def __init__(self): self.bx = 10 super().__init__() def __repr__(self): return super().__repr__() + " bx: {}".format(self.bx)
按预期工作
答案 1 :(得分:0)
编辑:
不是在__init__
上进行计算,而是在工厂函数/类方法中做一个想法。
示例而不是:
class A:
def __init__(self, a, b):
self.a = a
self.b = b
self.initialize()
def initialize(self):
# do some things
执行:
class A:
def __init__(self, a, b):
self.a = a
self.b = b
@classmethod
def from_a_b(cls, a, b):
instance = cls(a, b)
instance.initialize()
return instance