我对继承/重载有疑问。为了理解我的问题,我认为最好先显示一段代码:
class A():
def __init__(self):
self.var1 = 10
self.var2 = 20
self.var3 = 30
class B(A):
def __init__(self): #Bad, because I am probably overloading the whole "constructor"
self.var2 = 15
类B继承自类A。现在,我的问题是,有没有办法只重载类B中的self.var2属性值,而又保持self.var1和self.var3不变?
答案 0 :(得分:4)
如果您在A
中没有任何奇怪之处(例如只读属性),则可以简单地允许A.__init__
来完成其工作,然后在{{ 1}}:
B.__init__
但这在设计中提出了一些可能的问题。如果class B(A):
def __init__(self):
super().__init__()
self.var2 = 15
是可扩展的,则可能值得考虑使用默认值作为参数,而不是将其硬编码到构造函数中:
A
现在,子类可以调用其class A():
def __init__(self, var1=10, var2=20, var3=30):
self.var1 = var1
self.var2 = var2
self.var3 = var3
初始化程序,并且仅覆盖其所需的值:
super
或更好
class B(A):
def __init__(self):
super().__init__(var2=15)
答案 1 :(得分:0)
我认为您在概念上误解了OOPs范例。首先,初始化程序仅用于初始化类的对象,但是在您的代码__init__
中,属性具有硬代码值,因此类的每个对象对于这些属性将具有相同的值。
如果这是您想要的,则将其作为类变量,或者仅将属性b
作为类属性。
其次,在您的类B
中,尽管您是从类A
继承的,但初始化程序并未被重载,因为您没有显式调用__init__
类的super
。因此,要么在类B中使用super().__init__()
,要么只是将其删除,它就会自动调用超类的__init__
。
希望它使事情变得更清楚。