在其他语言中,属性以_开头一般用于表示这个属性是私有属性,不能在外部访问。
在python中是不存在私有属性这种说法的。以_开头的属性,只是表名是私有属性,和API的调用没有关系。但是也是可以调用的
class A(): def __init__(self): self._private = "am I private?" a = A() print(a._private)
# 结果
# ‘am I private?’
以_ _开头的属性,可以实现私有的功能。但它真正的用途是防止子类重写该属性。
class A(): def __init__(self): self.__private = "am I private?" a = A() print(a.__private) # Traceback (most recent call last): # File "E:/WWW/py3/test/config.py", line 7, in <module> # print(a.__private) # AttributeError: ‘A‘ object has no attribute ‘__private‘
_ _private属性依旧可以被访问。以上的调用报错的原因,是调用错了名字。
_ _实现防止子类重写的原理,其实就是给属性改一个名字。
我们用dir()函数可以看到
class A(): def __init__(self): self.__private = "am I private?" a = A() print(dir(a)) #[‘_A__private‘, ‘__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__‘]
这个‘_A__private‘其实就是__private。为了防止复写,给他改了个名字(总觉得这种处理方式有点萌哈哈哈哈)
所以如果想调用,甚至修改,只需要调用 a._A__private
但是别这么做啊!!!!
class A(): def __init__(self): self.__private = "am I private?" def func(self): print(self.__private) a = A() a.func() a._A__private = ‘nonono‘ a.func() # am I private? # nonono