仅重载 __init__ 的一个特定属性

Overloading only one specific attribute of __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

Class B 继承自 class A。现在我的问题是,有没有办法只重载 class B 中属性 self.var2 的值,同时保持 self .var1 和 self.var3 原样?

如果你在 A 中没有任何奇怪的东西,比如 read-only 属性,你可以简单地让 A.__init__ 完成它的工作,然后改变你想要的一个值在 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

现在 child 类 可以调用他们的 super 初始化程序并仅覆盖他们需要的值:

class B(A):
    def __init__(self):
        super().__init__(var2=15)

或更好

class B(A):
    def __init__(self, var2=15):
        super().__init__(var2=var2)

我认为您在概念上误解了 OOP 范式。首先,初始化程序仅用于初始化 class 的对象,但是在您的代码中 __init__ 具有属性的硬编码值,因此 class 的每个对象都将具有相同的这些属性的值。

如果这是您想要的,那么将它们作为 class 变量或将属性 b 作为 class 属性。

其次在你的 class B 中,虽然你继承自 class A 初始化器没有被重载,因为你没有明确调用 __init__ super class。所以要么在 class B 中使用 super().__init__() 要么简单地删除它,然后它会自动调用超级 class.

__init__

希望它能让事情更清楚。