Недавно я написал ряд функций, которым требовался атрибут маркера:
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'
Как атрибуты метода становятся видимыми, когда он связан?