Какие методы вызываются при создании объекта старого стиля в Python 2.7? - PullRequest
0 голосов
/ 09 мая 2020

Мне трудно понять, какие методы вызываются при создании объекта старого стиля.

Проведя небольшое исследование, я обнаружил, что это различие применимо только к python 2.7, а не к python 3 Однако я тестирую методы в коде:

class OldClass():
    pass

class NewClass(object):
    pass

old = OldClass()
new = NewClass()

print(type(old))
print(type(new))
print(old.__class__) #It retrieves __main__
print(old.__new__)  #Never called
print(old.__init__) #Never called

И вот результат:

<type 'instance'>
<class '__main__.NewClass'>
__main__.OldClass
Traceback (most recent call last):
File "main.py", line 29, in <module>
print(old.__init__)
AttributeError: OldClass instance has no attribute '__init__'

Я продолжаю исследования для этого топи c, вот некоторые ссылки с некоторой связанной информацией:

Класс нового стиля против старого стиля: https://www.youtube.com/watch?v=KwpnXqnVx2o

переполнение стека нового стиля против класса старого стиля: Что такое разница между классами старого и нового стиля в Python?

Если я что-то найду, я обновлю сообщение

1 Ответ

1 голос
/ 10 мая 2020

__init__ существует только и называется , только если вы определяете его . Поскольку вы не определили __init__, он не вызывается. Когда он определен, это единственная полезная точка перехвата для создания экземпляра, и большая часть того, что вы пытаетесь сделать, отлично работает .

Классы нового стиля также могут использовать __new__, чтобы перехватить конструкцию экземпляра (в отличие от инициализации), а также разрешить использование метаклассов (которые могут перехватывать вещи еще более безумными способами), но они недоступны для классов старого стиля (определение __new__ ничего не меняет , а использование метаклассов неявно выбирает классы нового стиля).

...