微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这个名称修改目的的总结是否正确? 来自文档:我的解释:问题:

如何解决这个名称修改目的的总结是否正确? 来自文档:我的解释:问题:

来自文档:

由于类私有成员有一个有效的用例(即避免名称与子类定义名称名称冲突),因此对这种称为名称修改的机制的支持有限。任何 __spam 形式的标识符(至少两个前导下划线,最多一个尾随下划线)在文本上替换为 _classname__spam,其中 classname 是当前类名,去掉了前导下划线。只要标识符出现在类的定义中,就可以在不考虑标识符的句法位置的情况下完成此修改

我的解释:

  1. 修改父类方法名称 parent.__m(a,b) 以允许子类使用额外的参数 child.m(a,b,c) 重载它。这样,当您调用 child.m(1,2,3) 时,额外的参数不会被传递给父类并使其混淆。

  2. 如果您打算保留相同的方法签名但更改一些内部功能,则不需要修改。您仍然可以使用 super() 访问旧功能

  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 没有方法重载,方法调用中参数的数量或类型不用于确定调用哪个方法;仅使用方法名称。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。