python - Very strange behavior of operator 'is' with methods -
why first result false
, should not true
?
>>> collections import ordereddict >>> ordereddict.__repr__ ordereddict.__repr__ false >>> dict.__repr__ dict.__repr__ true
for user-defined functions, in python 2 unbound , bound methods created on demand, through descriptor protocol; ordereddict.__repr__
such method object, wrapped function implemented pure-python function.
the descriptor protocol phone call __get__
method on objects back upwards it, __repr__.__get__()
called whenever seek access ordereddict.__repr__
; classes none
(no instance) , class object passed in. because new method object each time function __get__
method invoked, is
fails. not same method object.
dict.__repr__
not custom python function c function, , __get__
descriptor method essentially returns self
when accessed on class. accessing attribute gives same object each time, is
works:
>>> dict.__repr__.__get__(none, dict) dict.__repr__ # none means no instance true
methods have __func__
attribute referencing wrapped function, utilize test identity:
>>> ordereddict.__repr__ <unbound method ordereddict.__repr__> >>> ordereddict.__repr__.__func__ <function __repr__ @ 0x102c2f1b8> >>> ordereddict.__repr__.__func__.__get__(none, ordereddict) <unbound method ordereddict.__repr__> >>> ordereddict.__repr__.__func__ ordereddict.__repr__.__func__ true
python 3 away unbound methods, function.__get__(none, classobj)
returns function object (so behaves dict.__repr__
does). see same behaviour bound methods, methods retrieved instance.
python python-2.7 methods python-internals
No comments:
Post a Comment