如果使用的旧技巧__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