我有一个类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/