2016-11-10 4 views
1

В документации по методам экземпляра говорится, что:Установка атрибутов на __func__

Методы также поддерживает доступ (но не установка) произвольная функция атрибутов на основе объекта функции.

Но я, похоже, не могу проверить это ограничение. Я попытался установить как произвольное значение, и один из «специальных атрибутов» функций:

class cls: 
    def foo(self): 
     f = self.foo.__func__ 
     f.a = "some value" # arbitrary value 
     f.__doc__ = "Documentation" 
     print(f.a, f.__doc__) 

При выполнении ошибок не производится, и выход, как ожидается:

cls().foo() # prints out f.a, f.__doc__ 

Что это такое, что Я не понимаю документацию?

ответ

2

Вы неправильно понимаете, что говорится. В нем говорится, что вы можете получить доступ, но не установить атрибуты базового объекта функции по методу!

>>> class Foo: 
...  def foo(self): 
...   self.foo.__func__.a = 1 
...   print(self.foo.a) 
...   self.foo.a = 2 
... 
>>> Foo().foo() 
1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in foo 
AttributeError: 'method' object has no attribute 'a' 

Обратите внимание, как foo.a обновляется, когда вы установите его на значение __func__, но вы не можете установить его непосредственно с помощью self.foo.a = value.

Таким образом, объект функции может быть изменен, как вам угодно, метод обертка обеспечивает доступ только для чтения к атрибутам базовой функции.

+0

О, черт возьми, глупо меня. Спасибо, что поняли это. – user6774416

Смежные вопросы