Rad*_*nik 5 python oop inheritance
今天我看到 - python添加_$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
Run Code Online (Sandbox Code Playgroud)
那项工作,但是:
>>> 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
Run Code Online (Sandbox Code Playgroud)
为什么?我不知道,所以我给了它.这里是:
>>> print([fn for fn in dir(B) if fn[-2:] != '__'])
['_A__b', '_B__b', 'a']
Run Code Online (Sandbox Code Playgroud)
为什么python这样做?有办法绕过那个吗?
jdi*_*jdi 12
虽然这些都不是python严格执行的,但双下划线的命名约定意味着"私有",而单个下划线意味着"受保护".
双下划线旨在通过使用相同的名称来保护子类不会导致错误.通过按名称对它们进行命名,定义类可以确保其变量保持有效.
单个下划线意味着子类可以自由访问和修改那些与超类共享的相同属性.
两种形式都表明任何外部类都不应该访问这些.
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
Run Code Online (Sandbox Code Playgroud)
此示例显示即使类B定义了一个new __private,它也不会影响继承的show方法,该方法仍然访问原始的超类属性._protected然而,修改了超类show方法,因为它们是相同的属性.