the output in reference of descriptor.

luofeiyu elearn2014 at gmail.com
Thu Aug 21 21:25:02 EDT 2014


      class C(object):
         a = 'abc'
         def __getattribute__(self, *args, **kwargs):
             print("__getattribute__() is called")
             return object.__getattribute__(self, *args, **kwargs)
         def __getattr__(self, name):
             print("__getattr__() is called ")
             return name + " from getattr"
         def __get__(self, instance, owner):
             print("__get__() is called", instance, owner)
             return self
         def foo(self, x):
             print(x)


     class C2(object):
         d = C()


 >>> c2.d
__get__() is called <__main__.C2 object at 0x000000000297BE10> <class 
'__main__.
C2'>
<__main__.C object at 0x000000000297BBA8>

I understant the result ,c2.d trigger the __get__ method in class C.
     def __get__(self, instance, owner):
         print("__get__() is called", instance, owner)
         return self

It print "__get__() is called", instance, owner and return self 
`<__main__.C object at 0x000000000297BBA8>`


 >>> c2.d.a
__get__() is called <__main__.C2 object at 0x000000000297BE10> <class 
'__main__.
C2'>
__getattribute__() is called
'abc'

Why the result of c2.d.a  is not :

__get__() is called <__main__.C2 object at 0x000000000297BE10> <class 
'__main__.
C2'>
__getattribute__() is called
'abc'

Why the` return self` in the __get__ method in class C  does not work?




More information about the Python-list mailing list