python技巧

python 设置只读属性(property或者__setter

2018-08-30  本文已影响0人  陆_志东

python设置只读属性的方式有两种

方式一:

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
上一篇 下一篇

猜你喜欢

热点阅读