问题描述
来自文档:
由于类私有成员有一个有效的用例(即避免名称与子类定义的名称的名称冲突),因此对这种称为名称修改的机制的支持有限。任何 __spam 形式的标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中 classname 是当前类名,去掉了前导下划线。只要标识符出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成此修改。
我的解释:
-
修改父类方法的名称
parent.__m(a,b)
以允许子类使用额外的参数child.m(a,b,c)
重载它。这样,当您调用child.m(1,2,3)
时,额外的参数不会被传递给父类并使其混淆。
问题:
我的总结是否正确?文档写得不好。很多连续的句子和中游(旁白)使我无法确定自己是否理解正确。
编辑:我只是玩了一些代码:
class Parent( object ):
def __init__(self,a,b):
self.a = a
self.b = b
def method( self ):
return 1
class Child(Parent):
def __init__(self,c ):
super().__init__(a,b)
def method(self,c):
field = [c]
return field
a,c = 0,1,2
c = Child(a,c)
print(c)
这已经足够了。我遇到的唯一问题是如果我做这样的事情:
class Parent( object ):
def __init__(self,b):
self.a = a
self.b = b
self.c = self.method()
def method( self ):
return 1
class Child(Parent):
def __init__(self,b)
self.c = self.method(c)
def method(self,c)
哪个返回
TypeError: method() missing 1 required positional argument: 'c'
此答案对此进行了讨论:Python,Overriding an inherited class method
所以在一天结束时,我似乎仍然不明白目的是什么。
解决方法
子类不需要名称修改来覆盖具有更多参数的方法。目的是防止覆盖一个方法,特别是覆盖一个“私有”方法,该方法为类提供一些内部目的,其行为不应被子类改变。
这个想法是,如果一个子类声明了一个“相同”名称的方法,它将被修改为一个不同的方法,以避免覆盖超类的方法。与 Java 相比,Java 中的 private
方法不能被覆盖,甚至不能从子类中调用。
class A:
def foo(self):
self.bar()
self.__baz()
def bar(self):
print('A.bar')
def __baz(self):
print('A.__baz')
class B(A):
def bar(self):
print('B.bar')
def __baz(self):
print('B.__baz')
B().foo()
输出:
B.bar
A.__baz
请注意,这是关于覆盖,而不是重载。 Python 没有方法重载,方法调用中参数的数量或类型不用于确定调用哪个方法;仅使用方法名称。