在上面的只读属性中有很多方法都能修改只读属性的值,比如per.__dict__['_Person__money'] = 80。在python内部每次对只读属性进行操作的时候都会调用__setattr__方法,这个方法操作之后才会存储到__dict__中所以我们可以通过这个方法来做安全处理。
class Person(object):
def __setattr__(self, key, value):
print(key, value)
p1 = Person()
p1.age = 18
print(p1.__dict__) # 到此为止还没有吧age = 18添加到属性中
上面定义好了一个类,并且重写了__setattr__方法,下面我们来添加属性。
class Person(object):
def __init__(self):
self.age = 19
def __setattr__(self, key, value):
if key == 'age' and key in self.__dict__.keys(): # 判断key是只读的age并且存在于属性中,否则就是添加属性
print('只读属性不允许修改')
else:
self.__dict__[key] = value
我们再实例化一个对象看看运行的结果。
p2 = Person()
p2.age = 18 # 不能修改只读属性
# print(p2.age) # 无法只读,在上面的if中要加上另一个条件
p2.sex = 'man' # 不是只读属性
print(p2.__dict__)
返回结果:
只读属性不允许修改
{'age': 19, 'sex': 'man'}
从结果可以看出来每当我们增加属性的时候,其内部代码都会走一遍__setattr__方法。