Как атрибуты функции прозрачно отображаются методом - PullRequest
0 голосов
/ 30 октября 2018

Недавно я написал ряд функций, которым требовался атрибут маркера:

def fn1(): pass
fn1.mark = True

Фактическая маркировка была сделана декоратором, но это ни здесь, ни там. Меня беспокоило, что, когда я помечаю методы в классе таким же образом, маркер не будет виден при привязке метода:

class A:
    def meth1(): pass
    meth1.mark = True

Но на самом деле атрибут был виден просто отлично:

>>> fn1.mark
True
>>> A.meth1.mark
True
>>> A().meth1.mark
True

Однако атрибут не может быть назначен или удален в связанном методе, как это может быть в функции:

>>> A().meth1.mark = False
AttributeError: 'method' object has no attribute 'mark'

>>> del A().meth1.mark
AttributeError: 'method' object has no attribute 'mark'

Как атрибуты метода становятся видимыми, когда он связан?

1 Ответ

0 голосов
/ 30 октября 2018

Объекты метода реализуют __getattribute__, чтобы делегировать доступ к атрибутам для неизвестных атрибутов базовому объекту функции. Однако они не делегируют __setattr__, поэтому назначение не удалось. Если вы хотите увидеть код, это method_getattro в Objects/classobject.c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...