1 通过 __setattr__
方法过滤
1.1 python中没有完全的只读属性,因为可以通过以下方式进行赋值
p._Person__age = 10
或
p.__dict__['_Person__age'] = 10
1.2 限制通过点语法修改属性,至少将下面方式屏蔽掉
p._Person__age = 10
1.3 通过对 __setattr__
方法进行拦截操作,优化只读属性
class Person:
# 当我们通过 "实例.属性 = 值", 给一个实例增加一个属性, 或者说, 修改一下属性值的时候, 都会调用这个__setattr__方法
# 在__setattr__方法内部才会真正的把属性, 以及对应的数据, 给存储到__dict__字典里面
def __setattr__(self, key, value):
print(key, value)
# 1. 判定, key, 是否是我们要设置的只读属性的名称
if key == "age" and key in self.__dict__.keys():
print("这个属性是只读属性, 不能设置数据")
# 2. 如果说不是, 只读属性的名称, 真正的给它添加到这个实例里面去
else:
# self.key = value
self.__dict__[key] = value
p = Person()
p.age = 18
print(p.age)
p.age = 999
print(p.age)
print(p.__dict__)
>>> 打印结果
age 18
18
age 999
这个属性是只读属性, 不能设置数据
18
{'age': 18}
注意:
目前,即使优化后不能通过“实例.属性 = 值”方式进行属性修改,但是如果外界通过p.__dict__['_Person__age'] = 10
进行修改操作的话还是可以的
2 常见系统内置属性
- 类属性
__module__
:类定义所在的模块
__doc__
:类的文档字符串
__name__
:类名
__bases__
:类的所有父类构成元组
__dict__
:类的属性
- 实例属性
__class__
:实例对应的类
__dict__
:实例的属性
网友评论