在python attrs类中,如何用我自己的方法覆盖生成的__init __

问题描述 投票:0回答:2

所以我喜欢使用attr,但有时我需要做自己的事。我可以用我自己的方法覆盖__init__方法吗?

import attr
@attr.s(auto_attribs=True)
class MyClass:
     i: int
     def __init__(self, i, special=None):
          if special:
               self.i = special
          else:
               self.i = i
>>> a = MyClass(i=1,special=2)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    a = MyClass(i=1,special=2)
TypeError: __init__() got an unexpected keyword argument 'special'
python python-3.7 python-attrs
2个回答
1
投票

attrs by Examples”页面说:

有时,您希望类的__init__方法做的不仅仅是初始化,验证等。使用@ attr.s时,这些方法会自动为您完成。为此,只需在您的类中定义__attrs_post_init__方法。将在生成的__init__方法的末尾调用它。

>>> @attr.s
... class C(object):
...     x = attr.ib()
...     y = attr.ib()
...     z = attr.ib(init=False)
...
...     def __attrs_post_init__(self):
...         self.z = self.x + self.y
>>> obj = C(x=1, y=2)
>>> obj
C(x=1, y=2, z=3)

0
投票

我认为您可以创建class方法,例如,

@attr.s
class MyAttrClass(object):
    i = attr.ib()

    @classmethod
    def from_special(cls, special=None):
        if special:
            return cls(special)


m = MyAttrClass.from_special(special=10)
© www.soinside.com 2019 - 2024. All rights reserved.