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?

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to