Python: Как понять __new__ как определено во встроенном объектном классе? - PullRequest
0 голосов
/ 05 июня 2019

Прежде всего, это не дублирование Почему __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 *

Как это имеет смысл?

1 Ответ

2 голосов
/ 05 июня 2019

Некоторые реализации Cpython написаны на C, поэтому PyCharm не может перейти к исходному коду, потому что он скомпилирован. Однако он может отображать заглушки, эмулирующие подпись, и отображает их.

Исходный код object.__new__ для 3.7.3 можно найти в их репозитории Github: https://github.com/python/cpython/blob/v3.7.3/Objects/typeobject.c#L3671-L3732

...