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

我知道,Python中没有“真正的”私有/受保护的方法。这种方法并不意味着要隐藏任何东西。我只想了解Python的功能。


class Parent(object):

    def _protected(self):

        pass


    def __private(self):

        pass


class 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'

那么,这种行为是否意味着“受保护”的方法将被继承,但“私有”的方法将不会被继承呢?

还是我错过了什么?


动漫人物
浏览 912回答 3
3回答

牧羊人nacy

将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()这具有允许方法不与子类方法名称冲突的其他好处(或有人说主要的好处)。

慕哥9229398

另外PEP8说仅对非公共方法和实例变量使用前导下划线。为避免名称与子类冲突,请使用两个前导下划线来调用Python的名称处理规则。Python将这些名称与类名称混为一谈:如果class Foo具有名为的属性__a,则不能通过进行访问Foo.__a。(坚持的用户仍然可以通过调用获得访问权限Foo._Foo__a。)通常,双引号下划线仅应用于避免名称与设计为子类的类中的属性发生冲突。_such_methods按照惯例,您也应该远离。我的意思是你应该把他们当成private
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python