小编y3t*_*3t1的帖子

有没有办法为继承的类实现 __post_init__ 方法?

我想防止实例的用户在使用所述对象时错误地创建不存在的属性。

假设我有一个带有 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__() …

python metaclass decorator python-3.x python-decorators

3
推荐指数
1
解决办法
466
查看次数