美文网首页python技巧
python 设置只读属性(property或者__setter

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

作者: 陆_志东 | 来源:发表于2018-08-30 11:25 被阅读0次

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

相关文章

网友评论

    本文标题:python 设置只读属性(property或者__setter

    本文链接:https://www.haomeiwen.com/subject/dduziftx.html