Прежде всего, это не дублирование Почему __init__ не вызывается после __new__ ИНОГДА , потому что этот вопрос действительно касается реализации встроенного класса object
.
Вот полная история:
Я узнаю о __new__
против __init__
в Python.Вот пример, который я пробовал:
class A(object):
def __new__(cls):
print("A.__new__ called")
return super(A, cls).__new__(cls)
def __init__(self):
print("A.__init__ called")
A()
print('finished')
Вывод
A.__new__ called
A.__init__ called
finished
Я понимаю, что __new__
создает объект, а __init__
выполняет инициализацию объекта.
__new__
вызывается автоматически при вызове имени класса.Затем __init__
вызывается каждый раз, когда экземпляр класса возвращается __new__
, передавая возвращенный экземпляр в __init__
в качестве параметра self
.
Зная это, если у нас плохая функция __new__
, которая не создает и не возвращает экземпляр объекта, то __init__
не будет вызываться:
class A(object):
def __new__(cls):
print("A.__new__ called")
#return super(A, cls).__new__(cls)
def __init__(self):
print("A.__init__ called")
A()
Обратите внимание, что *Метод 1032 * печатает только строку.Он ничего не возвращает, поэтому __init__
нечего подобрать.И действительно, вывод подтверждает это:
A.__new__ called
finished
"A.__init__ called"
никогда не печатается, поэтому __init__
действительно никогда не вызывается.
Теперь, если мы не определим метод __new__
(этосоставляет 99% от общего случая использования. программистам редко требуется определять этот метод), тогда папа __new__
вызывается по умолчанию.например,
class A(object):
def __init__(self):
print("A.__init__ called")
A()
print('finished')
вывод:
A.__init__ called
finished
В этом случае вызывается __new__
встроенного класса object
.
НО, когда я посмотрел, как определяется встроенный класс object
, я вижу это:
class object:
""" The most base type """
def __delattr__(self, *args, **kwargs): # real signature unknown
""" Implement delattr(self, name). """
pass
...
...
...
@staticmethod # known case of __new__
def __new__(cls, *more): # known special case of object.__new__
""" Create and return a new object. See help(type) for accurate signature. """
pass
НИЧЕГО не реализовано в __new__
!Внутри просто сидит pass
!! ?? 1059 *
Как это имеет смысл?