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 B
的 super().__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))
希望对您有所帮助
请看下面的代码。部分解释为:
B's constructor calls its direct superclass's constructor via line
super().__init__(y)
(super()
returns a reference to the direct superclass). so, objectb
inherits propertyx
and its value is set to2
since this is the default value inB
's constructor when no parameter is provided.So, after object
b
is created,b.x
has a value of2
."
我的问题是:b.x
如何得到2
的值?不应该 class B
的 super().__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))
希望对您有所帮助