Краткий ответ: нет способа добавить пользовательские атрибуты в связанные методы.
Полный ответ следует.
В 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__
и не имеющие __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 "<stdin>", line 1, in <module>
AttributeError: 'c' object has no attribute 'c'