仅重载__init__的一个特定属性

问题描述 投票:1回答:2

我有关于继承/重载的问题。要了解我的问题,我认为最好首先展示一段代码:

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

python inheritance overloading init
2个回答
4
投票

如果你在A中没有任何怪异,比如只读属性,你可以简单地允许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

现在,子类可以调用它们的super初始化程序并仅覆盖它们所需的值:

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

还是更好

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

0
投票

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

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

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

希望它能让事情更加清晰。

© www.soinside.com 2019 - 2024. All rights reserved.