В Python (2 и 3), мы можем присвоить атрибуты функции:Установка атрибутов метода после создания класса повышает «„instancemethod“объект не имеет атрибута», но attribiute явно есть
>>> class A(object):
... def foo(self):
... """ This is obviously just an example """
... return "FOO{}!!".format(self.foo.bar)
... foo.bar = 123
...
>>> a = A()
>>> a.foo()
'FOO123!!'
И это круто.
Но почему мы не можем изменить foo.bar
в более позднее время? Например, в конструкторе, например, так:
>>> class A(object):
... def __init__(self, *args, **kwargs):
... super(A, self).__init__(*args, **kwargs)
... print(self.foo.bar)
... self.foo.bar = 456 # KABOOM!
... def foo(self):
... """ This is obviously just an example """
... return "FOO{}!!".format(self.foo.bar)
... foo.bar = 123
...
>>> a = A()
123
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __init__
AttributeError: 'instancemethod' object has no attribute 'bar'
Python утверждает, что нет bar
даже если она напечатана его оштрафовать только на предыдущую строку.
То же ошибка происходит, если мы пытаемся изменить его непосредственно на классе:
>>> A.foo.bar
123
>>> A.foo.bar = 345 # KABOOM!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'instancemethod' object has no attribute 'bar'
Что здесь происходит, то почему мы видим такое поведение?
Есть ли способ установить атрибуты для функции после создания класса?
(я знаю нескольких альтернатив, но я явно интересно об атрибутах на методы здесь, или, возможно, более широкий вопрос.)
Мотивация: Django использует возможность для установки атрибутов по методам, например:
class MyModelAdmin(ModelAdmin):
...
def custom_admin_column(self, obj):
return obj.something()
custom_admin_column.admin_order_field ='relation__field__span'
custom_admin_column.allow_tags = True
'self.foo'' '' '' '' '' '' '' 'функция, которую вы определили. Среди других отличительных особенностей 'self.foo' принимает нулевые аргументы, а функция' foo', которую вы написали, берет один. – user2357112