仅重载__init __

时间:2019-02-16 17:06:49

标签: python inheritance overloading init

我对继承/重载有疑问。为了理解我的问题,我认为最好先显示一段代码:

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不变?

2 个答案:

答案 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__

希望它使事情变得更清楚。