python设置只读属性的方式有两种
- 1.通过
property
装饰器和私有属性配合完成只读属性
- 2.借助__setter__方法,设置逻辑阻止赋值
方式一:
class Task(object):
def __init__(self):
self.__x = 1 # 在python中私有属性__会有一层保护机制的(改变名字),在类外面调用的时候不再是__x这个名字,
# 但再类的内部变量的名字还是__x
@property # 通过property装饰器只通过get方法,不提供set方法和delete方法来实现只读
def get_x(self):
return self.__x
task = Task()
try:
print(task.__x)
except Exception as e:
print("no __x")
print(task.get_x)
输出结果:
no __x
1
点击查看property的详细使用
方式二:
class Task(object):
def __init__(self):
self.a=2 # 注意这里写 self.a不起作用的,因为被__setter__方法拦截了,下面的调用task.a会报错
def __setattr__(self, key, value):
if key == "a":
pass
else:
super(Task, self).__setattr__(key,value)
task = Task()
print(task.a)
task.a = 10
print(task.a)
报错:
AttributeError: 'Task' object has no attribute 'a'
这是因为self.a被拦截了,根本就没有a这个实例属性
想要不报错,就需要设置一个类属性,
所有的实例共用这个类属性,但是所有的实例的__setter__方法又被修改了,
所以所有的实例都是继承这个类属性,没有办法修改,变相实现了只读属性,代码如下
class Task(object):
a = 1
def __init__(self):
pass
def __setattr__(self, key, value):
if key == "a":
pass
else:
super(Task, self).__setattr__(key,value)
task = Task()
print(task.a)
task.a = 10
print(task.a)
输出结果:
1
1
网友评论