权限访问(伪权限,只是压缩时按规则换了变量名,Python 的哲学是假定使用者都会使用)
_xx 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。若内部变量标示,如: 当使用“from M import”时,不会将以一个下划线开头的对象引入 (成俗约定,不做限制)。
__xx 双下划线的表示的是私有类型的变量(private)。只能允许这个类本身进行访问了,连子类也不可以用于命名一个类属性(类变量),调用时名字被改变(在类FooBar内部,__boo变成_FooBar__boo,如self._FooBar__boo)
__xx__定义的是特列方法。用户控制的命名空间内的变量或是属性,如init , __import__或是file 。只有当文档有说明时使用,不要自己定义这类变量。 (就是说这些是python内部定义的变量名)
##例
class A:
__age = 18
print(dir(A()))
print(A()._A__age)
打印
['_A__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
18
__age变量名称被压缩成_A__age,外部使用该名称调用即可
class A:
def __fn(self):
print(self.name)
class B(A):
def pp(self, name):
self.name=name
# def _A__fn():
# print(self.name)
b=B()
b.pp('321')
print(dir(b)) #打印b实例的属性与方法
b._A__fn()
打印
['_A__fn', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'pp']
321
可看出A类的fn()已被B类以新的名称(_A__fn)继承过来
实际相当于
class A:
def __fn(self):
print(self.name)
class B(A):
def pp(self, name):
self.name=name
def _A__fn(self):
print(self.name)
b=B()
b.pp('321')
print(dir(b))
b._A__fn()