Python的“隐藏”方法与__(Python 'hide' methods wit

2019-09-21 15:43发布

今天,我看到了-蟒蛇添加_$CLASSNAME$的方法与名称以__

简单的例子:

>>> class A:  
...     def a(self):  
...         self.b()  
...     def b(self):  
...         print('A.b')  
...           
>>> class B(A):  
...     def b(self):  
...         print('B.b')  
...           
>>> B().a()  
B.b

这项工作,但是:

>>> class A:  
...     def a(self):  
...         self.__b()  
...     def __b(self):  
...         print('A.b')  
...           
>>> class B(A):  
...     def __b(self):  
...         print('B.b')  
...           
>>> B().a()  
A.b

为什么? 我不知道,所以我dir'ed它。 这里是:

>>> print([fn for fn in dir(B) if fn[-2:] != '__'])
['_A__b', '_B__b', 'a']

为什么蟒蛇做呢? 有没有办法绕过了吗?

Answer 1:

这就是所谓的名字改编并做是为了防止意外的名称冲突与父和子类。 你不能(也不应该,很多完全没有问题的代码使用它)禁用它。 你可以绕过它,但你不应该做,要么(这是非常丑陋的,你能避免它,当你需要访问它,你不应该允许名称重整摆在首位)。 只需使用你想要的任何地方,但立即在类内使用专用功能的单下划线。

查看教程 ,但忽略表示“私有”变量此任何引用。 这不是它的使用,除非您使用private在C ++ / Java的/ C#/ ...感private变量(相对于protected这些都是子类中可见)是从子类隐藏。 即使那么它是一个有缺陷的比喻。



Answer 2:

虽然这一切都不是严格执行蟒,双下划线的命名约定的意思是“私人”,而单下划线的意思是“受保护”。

双下划线是指通过使用相同的名称,以防止造成错误的子类。 通过类名的命名空间他们,定义类可以肯定它的变量仍然有效。

以单下划线表示子类可以自由地访问和修改的那些相同的属性,与所述超类共享。

这两种形式都表明 ,任何外部类不应该访问这些。

class A(object):

    __private = 'private'
    _protected = 'protected'

    def show(self):
        print self.__private 
        print self._protected

class B(A):
    __private = 'private 2'
    _protected = 'protected 2'

a = A()
a.show()
#private
#protected

b = B()
b.show()
#private
#protected 2

本实施例表明即使类B定义的新__private ,它不影响继承show方法,该方法仍然访问原始超类的属性。 _protected但是被修改和超show方法反映了这一点,因为他们是相同的属性。



文章来源: Python 'hide' methods with __