python - 初始化属性对象类并使其成为 const
问题描述
我想创建只读属性。下面的例子效果很好,它的灵感来自https://howto.lintel.in/how-to-create-read-only-attributes-and-restrict-setting-attribute-values-on-object-in -Python/
class Attr1(object):
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = int(value)
class Attr2(object):
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
self.value = int(value)
class AttrFormula(object):
def __get__(self, instance, owner):
return instance.attr1 / instance.attr2
class Class(object):
attr1 = Attr1()
attr2 = Attr2()
attrFormula = AttrFormula()
A = Class()
A.attr1 = 1
A.attr2 = 2
print("Class A attr1 =", A.attr1)
print("Class A attr2 =", A.attr2)
print("Class A attrFormula =", A.attrFormula)
B = Class()
B.attr1 = 3
B.attr2 = 3
print("Class B attr1 =", B.attr1)
print("Class B attr2 =", B.attr2)
print("Class B attrFormula =", B.attrFormula)
并输出:
Class A attr1 = 1
Class A attr2 = 2
Class A attrFormula = 0.5
Class B attr1 = 3
Class B attr2 = 3
Class B attrFormula = 1
但现在,我想改变
A = Class()
A.attr1 = 1
A.attr2 = 2
经过
A = Class(1,2)
因为我想禁用所有 setter 属性并使属性不可修改。像这样想要的东西:
class Attr1(object):
def __init__(self, value=None):
self.value = value
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
raise AttributeError("You can't change attr1")
class Attr2(object):
def __init__(self, value=None):
self.value = value
def __get__(self, instance, owner):
return self.value
def __set__(self, instance, value):
raise AttributeError("You can't change attr2")
class AttrFormula(object):
def __get__(self, instance, owner):
return instance.attr1 / instance.attr2
class Class(object):
attr1 = Attr1()
attr2 = Attr2()
attrFormula = AttrFormula()
def __init__(self, attr1, attr2):
self.attr1 = attr1 # ERROR because it calls __set__
self.attr2 = attr2
A = Class(1,2)
print("Class A attr1 =", A.attr1)
print("Class A attr2 =", A.attr2)
print("Class A attrFormula =", A.attrFormula)
B = Class(5,7)
print("Class B attr1 =", B.attr1)
print("Class B attr2 =", B.attr2)
print("Class B attrFormula =", B.attrFormula)
B.attr1 = 10 # Forbidden, desired error
如何初始化attr1
和attr2
进入Class
?
解决方案
推荐阅读
- linux - Linux基于文件名中不同列的排序
- typescript - 使用 Jest 模拟 @apollo/react-hooks useQuery
- selenium - Selenium, groovy, 不能执行任何 click(), sendKeys() 或类似功能
- ionic-framework - 如何在离子电容器中进行产品构建
- python - TypeError:无法腌制“weakref”对象
- c# - ZedGraph 在所有图表中显示范围
- python - 在另一个文件python中定义一个函数中使用的变量
- node.js - 节点的查询字符串:相同查询参数的解析数组的顺序
- wordpress - 我的网站加载非常缓慢,我不知道为什么
- discord.js - 从 client.once('ready' 等 discord.js 中运行 client.setActivity