Python class 不同参数的继承

Python class inheritance with different parameters

请看下面的代码。部分解释为:

B's constructor calls its direct superclass's constructor via line super().__init__(y) (super() returns a reference to the direct superclass). so, object b inherits property x and its value is set to 2 since this is the default value in B's constructor when no parameter is provided.

So, after object b is created, b.x has a value of 2."

我的问题是:b.x如何得到2的值?不应该 class Bsuper().__init__() 也包含一个 x 变量因为 superclass (A) 有 x在它的构造函数中?

我的观察是,无论 y 的值在 class B 自己的构造函数中(在本例中为 y=2),它都会成为 [=20= 的值]

class A:
    def __init__(self, x=5):
        self.x = x

class B(A):
    def __init__(self, y=2):
        super().__init__(y) 
            
    def set(self, y):
        self.x = y + 3
        return self.x
b = B()

print(b.set(b.x + 2))     

#结果为 7

您调用 super().__init__(y) 的事实与 A 的初始化程序接受名称 x 中的参数这一事实无关。仅当您通过关键字传递 名称时,收到的名称才重要。如果你想通过关键字传递名称,显然 super().__init__(y=y) 不会工作(A 不会收到名为 y 的参数),但 super().__init__(x=y) 会工作得很好,因为调用者调用他们的 own 变量(或在传递文字值时缺少变量)无关紧要,重要的是它传递到正确的位置或与正确的关键字名称。

你的玩具示例很奇怪(子类违反了 Liskov 替换原则,因为 B(y=1) 有效,但 A(y=1) 无效),这可能让你更加困惑,但是它提出的观点是有效的:当你按位置传递参数时,接收者调用什么参数并不重要,调用者调用它也不重要。

这是因为您在创建 super-class 构造函数时为 x 分配了一个新值,因此您可以从 super() 中删除 y。init (y),这应该会给你原始值 x=5

示例:

class A:
    def __init__(self, x=5):
        self.x = x


class B(A):
    def __init__(self, y=2):
        super().__init__() # removed y

    def set(self, y):
        self.x = y + 3
        return self.x


b = B()

print(b.set(b.x + 2))

希望对您有所帮助