我想防止实例的用户在使用所述对象时错误地创建不存在的属性。
假设我有一个带有 init 和一些属性的类:
class Foo(obj):
def __init__(self, a, b):
self.a = a
self.b = b
Run Code Online (Sandbox Code Playgroud)
我想启用设置现有属性,同时防止创建新属性:
myobj = foo(1,2)
>>
print(myobj.a)
>> 1
myobj.a = 2
myobj.c = 1
>> AttributeError: frozen instance
Run Code Online (Sandbox Code Playgroud)
__setattr__使用override 和 boolean就相当容易了:
class Foo(obj):
_is_frozen = False
def __init__(self, a, b):
self.a = a
self.b = b
self._is_frozen = True
def __setattr__(self, name, value):
if not self._is_frozen or hasattr(self, name):
super().__setattr__(name, value)
else:
raise AttributeError("frozen instance")
Run Code Online (Sandbox Code Playgroud)
现在我遇到的困难是当一个新类继承 Foo 时。如果在调用 后必须定义新属性super().__init__(),则实例将被冻结。
我尝试使用装饰器来创建元类,但母类的装饰器仍然在调用时被调用super().__init__() …