Short answer:
Because it is part of Python specification.
Long answer:
It is something to do with __get__ special method.
If an attribute has a method __get__, it is called when the attribute is accessed with . (dot)
>>> class C(object):
... def __get__(*arg):
... print "hello", arg
...
>>> class D(object):
... d = C()
...
>>> D.__dict__["d"]
<__main__.C object at 0x00B32CB0>
>>> D.d
hello (<__main__.C object at 0x00B32CB0>, None, <class '__main__.D'>)
>>> D().d
hello (<__main__.C object at 0x00B32CB0>, <__main__.D object at 0x00B32CD0>, <cl
ass '__main__.D'>)
When you define a function, Python creates a function object and a function object has __get__ method.
>>> def f():pass
...
>>> f
<function f at 0x00B2EF30>
>>> dir(f)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__ge
tattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__r
educe__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure',
'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_na
me']
and when you call __get__ of the function object, guess what will be returned?
>>> f.__get__(D())
<bound method ?.f of <__main__.D object at 0x00B32D90>>
Yeah it returns a bound method. That's why a method becomes bound method when it is accessed with an instance.
The short answer is a Python specification and the long answer is its implementation. property is also implemented with __get__.
>>> dir(property(f))
['__class__', '__delattr__', '__delete__', '__doc__', '__get__', '__getattribute
__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__
', '__set__', '__setattr__', '__str__', 'fdel', 'fget', 'fset']
Sep. 5 added:
> This is called the descriptor protocol.
>
> See the following for a long description of descriptors:
>
> http://users.rcn.com/python/download/Descriptor.htm
Thanx Fuzzyman!
2 comments:
This is called the descriptor protocol.
See the following for a long description of descriptors:
http://users.rcn.com/python/download/Descriptor.htm
Hi fuzzyman,
Wow it's a very good guide.
Thanks!
Post a Comment