我想创建一个类成员,它可以由构造函数分配一个用户指定的值,但之后无法更改。有办法做到这一点吗?
到目前为止,我已经得到了以下代码,大部分都可以工作,但不是“白痴证明”。
def constantify(f):
def fset(self, value):
raise SyntaxError ('Not allowed to change value')
def fget(self):
return f(self)
return property(fget, fset)
class dummy(object):
def __init__(self,constval):
self.iamvar = None
self._CONST = constval
@constantify
def SOMECONST(self):
return self._CONST
dum = dummy(42)
print 'Original Val:', dum.SOMECONST
这会打印“Original Val: 42”
dum.SOMECONST = 24
这给出了正确的 SyntaxError
但是,输入一个白痴,
dum._CONST = 0
print 'Current Val:', dum.SOMECONST
给出“当前值:0”
是否有更好的防白痴方式来实现这一目标?
或者可初始化但之后保持常量的类成员在某种程度上不是“pythonic”方式? (我仍然是一个学习 pythonic 方式的新手) 在那种情况下,创建一个类的 pythonic 方法是什么,每个实例仅在实例化时是“可配置的”?
卡尔皮特
更新: 我不想创建一个所有成员都是不可变的类。我只希望一些成员保持不变,而其他成员随时可变。
最佳答案
我能想到的最简单的方法是覆盖 __setattr__
并在设置特定属性时引发错误,就像这样
class dummy(object):
def __init__(self, arg):
super(dummy, self).__setattr__("data", arg)
def __setattr__(self, name, value):
if name == "data":
raise AttributeError("Can't modify data")
else:
super(dummy, self).__setattr__(name, value)
a = dummy(5)
print a.data
# 5
a.data = "1"
# AttributeError: Can't modify data
关于Python - 如何创建在 __init__ 期间可配置的不可变类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23557667/