Python私有属性可以直接访问探究
问:python的私有属性长什么样?
回答问题之前,先上一段代码吧 ~~
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def getAge(self):
return self.__age
def setAge(self, age):
self.__age = age
p1 = Person("张三", 23)
print(p1.getAge()) # 打印结果:23
p1.setAge(24)
print(p1.getAge()) # 打印结果:24
在上述代码中,创建了一个Person类。
然后初始化name和age属性。
self.__name 和 self.__age,代表Python中的私有属性。
getAge() 和 setAge() 方法是向外界提供修改和访问私有属性的方法。
如果要真的__直接访问私有属性__,有没有办法呢?
答案是:有的
class Person(object):
def __init__(self, name, age):
self.__name = name
self.__age = age
def getAge(self):
return self.__age
def setAge(self, age):
self.__age = age
p1 = Person("张三", 23)
p1.setAge(24)
print(p1.getAge()) # 打印结果:24
print(p1.__dir__())
# 打印结果:
"""
['_Person__name', '_Person__age', '__module__', '__init__', 'getAge', 'setAge',
'__dict__', '__weakref__', '__doc__', '__repr__', '__hash__', '__str__', '__getattribute__', '__setattr__', '__delattr__', '__lt__', '__le__', '__eq__', '__ne__', '__gt__', '__ge__','__new__', '__reduce_ex__', '__reduce__', '__subclasshook__', '__init_subclass__','__format__', '__sizeof__', '__dir__', '__class__']
"""
p1._Person__age = 30
print(p1._Person__age) # 打印结果:30
print(p1.getAge()) # 打印结果:30
我们知道,对象.__dir__()打印出来的方法都可以被 ”对象“直接调用。
通过观察发现有'getAge', 'setAge'方法存在。
虽然没有‘__name’和‘__age’属性,但是我们发现了'_Person__name', '_Person__age'。
修改_Person__age的值为30。
打印 '_Person__age'的结果是30。
同时打印了p1.getAge()的结果,最终也是30。
原来,python底层对私有属性做了进一步的处理,只要发现有私有属性,就将其更改名字,名字形式是
_类名+私有属性名。
python的私有属性是伪私有,虽然可以直接访问,但是不建议这样操作。