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