我正在做一些分布式计算,其中多台机器在假设它们都具有不同类的相同版本的情况下进行通信。因此,让这些类变得不可变似乎是一个好的设计;并不是说它必须阻止一个怀有不良意图的用户,只是它足够不可变,以至于它永远不会被意外地修改。
我该怎么做呢?例如,我如何实现一个元类,使使用它的类在定义之后是不可变的?
>>> class A(object):
... __metaclass__ = ImmutableMetaclass
>>> A.something = SomethingElse # Don't want this
>>> a = A()
>>> a.something = Whatever # obviously, this is still perfectly fine.
替代方法也很好,比如一个装饰器/函数,它接受一个类并返回一个不可变的类。
发布于 2011-02-15 09:39:09
如果使用__slots__
的老把戏不适合您,这个或它的一些变体可以做到:只需编写元类的__setattr__
方法作为您的守卫。在本例中,我禁止分配新属性,但允许修改现有属性:
def immutable_meta(name, bases, dct):
class Meta(type):
def __init__(cls, name, bases, dct):
type.__setattr__(cls,"attr",set(dct.keys()))
type.__init__(cls, name, bases, dct)
def __setattr__(cls, attr, value):
if attr not in cls.attr:
raise AttributeError ("Cannot assign attributes to this class")
return type.__setattr__(cls, attr, value)
return Meta(name, bases, dct)
class A:
__metaclass__ = immutable_meta
b = "test"
a = A()
a.c = 10 # this works
A.c = 20 # raises valueError
发布于 2011-02-15 04:22:15
如果你不介意重用别人的作品:
http://packages.python.org/pysistence/
不变的持久化(在函数式中,不是写到桌面意义上)数据结构。
即使您不按原样使用它们,源代码也应该提供一些启发。例如,他们的expando类在它的构造函数中接受一个对象,并返回它的一个不可变的版本。
https://stackoverflow.com/questions/4996815
复制相似问题