Вывод в ссылку дескриптора

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=C2()
>>>c2.d  
__get__() is called <__main__.C2 object at 0x000000000297BE10> <class '__main__.C2'>  
<__main__.C object at 0x000000000297BBA8>  

Я понимаю результат,c2.d запускает метод get в классе C.

def __get__(self, instance, owner):    
    print("__get__() is called", instance, owner)    
    return self    

Он печатает "get() вызывается", instance, owner и возвращает self <__main__.C object at 0x000000000297BBA8>

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

Почему результат c2.da не так:

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

Почемуreturn self в методе get в классе C не работает? Почему в выводе нет < main.C объекта в 0x000000000297BBA8>?

1 ответ

Решение

< основной объект.C по адресу 0x000000000297BBA8>

не является частью печати, это результат выражения c2.d.

Другие вопросы по тегам