python只读属性怎么设置_python 设置只读属性(property或者__setter__方法)

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

方式二:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值