python - 具有属性构建的不可变类

标签 python oop immutability

我有一个类DifferentialExtension:

class DifferentialExtension(object):
    __slots__ = ('f', 'x', 'D', 'T')
    def __init__(self, f=None, x=None):
        /*
        # some code that builds up list 'self.D'
        */
        self.D = tuple(self.D)
        return None

我要使类“不可变”,即使用 DifferentialExtension 创建的对象不应被允许更改属性“D”(在 __init__ 完成之后),这些属性都不会分配给新对象。 D 不一定是 list,最终返回时可以是 tuple

In [1]: DE = DifferentialExtension(log(x), x)
In [2]: DE.D
Out[2]: ((Poly(1, x, domain='ZZ'), Poly(1/x, t0, domain='ZZ(x)'))
In [3]: DE.D = (1, 5, 5)  # raises Error.

最佳答案

通常在Python中,你必须假设使用你的类的人不会试图做一些恶毒的事情。因此,如果他真的想改变D的值,他可能有充分的理由。因此,您可能不想让 D 无法更改,因为这相当不符合 Python 风格。但是,您可能希望帮助用户避免意外更改 D。最好使用只读属性来完成此操作,如下所示:

class DifferentialExtension(object):
    def __init__(self, f=None, x=None):
        self._D = 'immutable value'
        return None

    @property
    def D(self):
        return self._D

运行此命令会给出:

>>> d = DifferentialExtension()
>>> d.D = 'mutate'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

如果用户确实想要更改该值,他可以通过直接访问self._D,但你必须假设他知道自己在做什么,因为他正在搞乱你的内部下划线变量之一。

关于python - 具有属性构建的不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44580557/

相关文章:

C#:不可变类

annotations - Flutter 不可变类?

python - 如何更改 flask 命令使用的主机和端口?

python - 通过 Python 扫描指令从打印机获取 PDF 文件

java - 数组作为适当的对象

python - 使用数据类初始化对象时修改属性

java - 在重载的构造函数中重用代码

Python偏导数容易

python - 让 lxml.objectify 忽略 xml namespace ?

scala - 不可变映射使用什么样的数据结构?