美文网首页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