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

标签 python class immutability member

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

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

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/

相关文章:

rust - Rust 中的不可变变量和常量变量有什么区别?

Python HTTP 服务器未响应 POST 请求

python - xml.etree.ElementTree - 设置 xmlns = '...' 时遇到问题

python - python WebSocket 客户端出现 "Connection is already closed."错误

javascript - 使用 JavaScript 更新 Css 类

java - @Immutable with @Entity and insertable=false and updateable=false on @Column

c# - Python 到 c# 减少函数理解

java - Java 中的类

android - 变量不更新值

scala - 来自Scala编程的功能性队列