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

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> 
</class>

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

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

Он печатает " get() называется", экземпляр, владелец и возвращает self <__main__.C object at 0x000000000297BBA8>

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

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

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

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

1 ответ

< main.C объект в 0x000000000297BBA8>

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

licensed under cc by-sa 3.0 with attribution.