在其他语言中,属性以_开头一般用于表示这个属性是私有属性,不能在外部访问。
在python中是不存在私有属性这种说法的。以_开头的属性,只是表名是私有属性,和API的调用没有关系。但是也是可以调用的
classA():def __init__(self):
self._private= "am I private?"a=A()print(a._private)
# 结果
# ‘am I private?’
以_ _开头的属性,可以实现私有的功能。但它真正的用途是防止子类重写该属性。
classA():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
# print(a.__private)
# AttributeError: 'A' object has no attribute '__private'
_ _private属性依旧可以被访问。以上的调用报错的原因,是调用错了名字。
_ _实现防止子类重写的原理,其实就是给属性改一个名字。
我们用dir()函数可以看到
classA():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
但是别这么做啊!!!!
classA():def __init__(self):
self.__private = "am I private?"
deffunc(self):print(self.__private)
a=A()
a.func()
a._A__private= 'nonono'a.func()#am I private?#nonono