为了账号安全,请及时绑定邮箱和手机立即绑定

Python中私有和受保护方法的继承

Python中私有和受保护方法的继承

动漫人物 2019-11-13 15:37:37
我知道,Python中没有“真正的”私有/受保护的方法。这种方法并不意味着要隐藏任何东西。我只想了解Python的功能。class Parent(object):    def _protected(self):        pass    def __private(self):        passclass Child(Parent):    def foo(self):        self._protected()   # This works    def bar(self):        self.__private()    # This doesn't work, I get a AttributeError:                            # 'Child' object has no attribute '_Child__private'那么,这种行为是否意味着“受保护”的方法将被继承,但“私有”的方法将不会被继承呢?还是我错过了什么?
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

将double __属性更改为_ClassName__method_name,使其比隐含的语义隐私更加私有_method_name。


如果您确实愿意,从技术上讲您仍然可以使用它,但是大概没人会这样做,因此出于维护代码抽象的原因,该方法在那时也可能是私有的。


class Parent(object):

    def _protected(self):

        pass


    def __private(self):

        print("Is it really private?")


class Child(Parent):

    def foo(self):

        self._protected()


    def bar(self):

        self.__private()


c = Child()

c._Parent__private()

这具有允许方法不与子类方法名称冲突的其他好处(或有人说主要的好处)。


查看完整回答
反对 回复 2019-11-13
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

另外PEP8说


仅对非公共方法和实例变量使用前导下划线。


为避免名称与子类冲突,请使用两个前导下划线来调用Python的名称处理规则。


Python将这些名称与类名称混为一谈:如果class Foo具有名为的属性__a,则不能通过进行访问Foo.__a。(坚持的用户仍然可以通过调用获得访问权限Foo._Foo__a。)通常,双引号下划线仅应用于避免名称与设计为子类的类中的属性发生冲突。


_such_methods按照惯例,您也应该远离。我的意思是你应该把他们当成private


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 907 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信