Не знаю, зачем ты вообще это сделал, но...
A.fA на самом деле является совершенно отдельным объектом по сравнению с функцией fA. Смотреть:
>>> class A(object):
... def fA(self): pass
... print fA
...
<function fA at 0x10f1c2a28>
>>> A.fA
<unbound method A.fA>
Как видите, A.fA — это «несвязанный метод», а не функция. «Непривязанный» означает, что он не связан ни с одним экземпляром; тогда как связанные методы привязаны к конкретному экземпляру. Наблюдать:
>>> A().fA
<bound method A.fA of <__main__.A object at 0x10f1d3d10>>
В любом случае методы оборачивают функции, которые их реализуют:
>>> A.fA.im_func
<function fA at 0x10f1c2a28>
Обратите внимание, что адрес тот же, что и напечатанный ранее.
Как ни странно, я не могу воспроизвести поведение, которое вы видите:
>>> A.fA.__dict__['x'] = 1
>>> A.fA.x
1
Возможно, эта разница связана с разными версиями python. Вот мой:
$ python
Python 2.7.2 (default, Jun 20 2012, 16:23:33)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
PS: A.fA.x, кажется, работает для меня так же хорошо, как и A.fA.im_func.x, что меня удивляет... Опять же, я немного подозрительно отношусь к тому, почему вы думаете об этом. Как правило, единственный раз, когда вы используете __dict__
, это если вы реализуете __getattr__
(не путать с __getattribute__
).
Также редко бывает хорошей идеей присваивать объектам (особенно объектам фундаментальных типов) специальные атрибуты. Альтернативой, которая обычно жизнеспособна, является использование вашей собственной карты, например.
>>> def foo(): pass
...
>>> my_x_values = {foo: 'X'}
>>> my_x_values[foo]
'X'
Хотя не все с этим согласны. Проверьте этот другой вопрос SO: Атрибуты функций Python - использование и злоупотребление
person
allyourcode
schedule
27.11.2012