Ответ 1
Краткий ответ: нет способа добавления настраиваемых атрибутов к связанным методам.
Далее следует длинный ответ.
В Python есть объекты-объекты и объекты метода. Когда вы определяете класс, оператор def
создает объект функции, который живет в пространстве имен класса:
>>> class c:
... def m(self):
... pass
...
>>> c.m
<function m at 0x025FAE88>
Объекты функций имеют специальный атрибут __dict__
, который может содержать пользовательские атрибуты:
>>> c.m.i = 0
>>> c.m.__dict__
{'i': 0}
Объектами метода являются разные животные. Это крошечные объекты, содержащие только ссылку на соответствующий объект функции (__func__
) и один на свой объект-хост (__self__
):
>>> c().m
<bound method c.m of <__main__.c object at 0x025206D0>>
>>> c().m.__self__
<__main__.c object at 0x02625070>
>>> c().m.__func__
<function m at 0x025FAE88>
>>> c().m.__func__ is c.m
True
Объекты метода предоставляют специальный __getattr__
, который перенаправляет доступ к объекту функции:
>>> c().m.i
0
Это также верно для свойства __dict__
:
>>> c().m.__dict__['a'] = 42
>>> c.m.a
42
>>> c().m.__dict__ is c.m.__dict__
True
Атрибуты настройки следуют правилам по умолчанию, и поскольку у них нет собственного __dict__
, невозможно установить произвольные атрибуты.
Это похоже на пользовательские классы, определяющие слот __slots__
и no __dict__
, при попытке установить несуществующий слот повышает значение AttributeError
(см. docs на __slots__
для получения дополнительной информации):
>>> class c:
... __slots__ = ('a', 'b')
...
>>> x = c()
>>> x.a = 1
>>> x.b = 2
>>> x.c = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'c' object has no attribute 'c'