使类在Python中不可变的方法
我正在做一些分布式计算,其中假设所有机器都具有相同版本的各种类,那么多台机器进行通信。因此,使这些类不可变似乎是一个很好的设计。并非一定要以不良意图挫败用户,只是要使其具有足够的不变性,以至于绝不会偶然修改它。
我将如何处理?例如,如何实现一个使定义后使用它的类不可变的元类?
>>> class A(object):
... __metaclass__ = ImmutableMetaclass
>>> A.something = SomethingElse # Don't want this
>>> a = A()
>>> a.something = Whatever # obviously, this is still perfectly fine.
备用方法也很好,例如接受一个类并返回不可变类的装饰器/函数。
-
如果使用的旧技巧
__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