面向对象-属性-属性安全补充。
# 在上面的只读属性中有很多方法都能修改只读属性的值,比如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添加到属性中
# 添加属性
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__)