Skip to main content
 首页 » 编程设计

Python之如何创建在 __init__ 期间可配置的不可变类成员

2025年05月04日15me-sa

我想创建一个类成员,它可以由构造函数分配一个用户指定的值,但之后无法更改。有办法做到这一点吗?

到目前为止,我已经得到了以下代码,大部分都可以工作,但不是“白痴证明”。

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