в классе attrs Python, как я могу переопределить сгенерированный __init__ с моим собственным - PullRequest
1 голос
/ 03 октября 2019

Так что мне нравится использовать 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'

Другой пример:

@attr.s(auto_attribs=True)
class MyOtherClass:
     i: int
     def __init__(self, i, **kwargs):
         self.i = kwargs.get('magic',i)



>>> a = MyOtherClass(i=5,magic=12)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    a = MyOtherClass(i=5,magic=12)
TypeError: __init__() got an unexpected keyword argument 'magic'

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Если вы передадите @attr.s(auto_attribs=True, init=False), attrs не создаст метод __init__ (работает так же для repr, eq, ...).

Он находится на немедленномдорожная карта для автоматического обнаружения присутствия пользовательского метода и установки init=False для вас. Я надеюсь, что он будет выпущен в следующем выпуске.

1 голос
/ 03 октября 2019

На странице " 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...