print('MyClass new', a, k)
... return object.__new__(*a, **k)
... def __init__(*a, **k):
... print('MyClass init', a, k)
... def __call__(*a, **k):
... print('MyClass call', a, k)
...
>>> obj = MyClass()
MyClass new (<class '__main__.MyClass'>,) {}
MyClass init (<__main__.MyClass object at 0x0000021D45B72AC0>,) {}
это на самом деле эквивалентно
>>> type.__call__(MyClass)
MyClass new (<class '__main__.MyClass'>,) {}
MyClass init (<__main__.MyClass object at 0x0000021D45B726D0>,) {}
<__main__.MyClass object at 0x0000021D45B726D0>
>>>
MyClass.__call__?
>>> obj()
MyClass call (<__main__.MyClass object at 0x0000021D45B72AC0>,) {}
эквивалентно:
>>> MyClass.__call__(obj)
MyClass call (<__main__.MyClass object at 0x0000021D45B72AC0>,) {}
>>>
спасибо Зарт, надеюсь от этого говна поубавится
Экземпляр использует методы которые прописаны в теле класса на котором он создан. Если MyClass наследуется от type, то у MyClass должен быть метод __call__
Он и есть. У родителя MyClass - type: In [8]: class MyClass: pass In [9]: MyClass.__call__ Out[9]: <method-wrapper '__call__' of type object at 0x2e97ca8>
Ты не понял. Экземпляр MyClass не сможет вызвать этот метод
>>> class A: pass ... >>> A() <main.A object at 0x0000021D45B72B80> >>> A.call() <main.A object at 0x0000021D45B727F0> >>>
Не может. Потому что у его базового класса (object) нет __call__, в отличие от класса type. У экземпляра одна цепочка mro, у класса другая.
У экземпляра нет MRO, ты смотришь MRO его класса
print(my_class_obl.__class__)
А как по твоему ищется метод у экземпляра? Ответ - по цепочке MRO его класса.
MRO его класса.*
Обсуждают сегодня