метод не вызывается из __new__

#python #new-operator #init

#python #new-оператор #инициализация

Вопрос:

в приведенном ниже коде я пытаюсь понять init и new . Проблема, с которой я сталкиваюсь, заключается в том, что метод callBeforeInit() никогда не вызывается.

Пожалуйста, дайте мне знать, почему он не вызывается и как его вызвать.

код:

 class varargs:

def __new__(cls):
    print("in object creation")
    callBeforeInit()
    return super(varargs, cls).__new__(cls)
    #return object.__new__(cls)

def __init__(self):
    print("in object indtansiation")

def callBeforeInit():
    print("called before init")

v = varargs()
 

ошибка:

 in object creation
Traceback (most recent call last):
File "d:python workspaceVarargs.py", line 15, in <module>
v = varargs()
File "d:python workspaceVarargs.py", line 5, in __new__
callBeforeInit()
NameError: name 'callBeforeInit' is not defined
 

Комментарии:

1. Ваш код не ссылается на метод, такой как cls.callBeforeInit — он ссылается на вызываемый объект с лексической областью, а именно просто callBeforeInit . Как указано в ошибке, такая вещь не определена.

Ответ №1:

new вызывается перед созданием объекта, поэтому на данный момент такого метода не существует.

Это должно быть

 class varargs:

    def __new__(cls):
        print("in object creation")
        cls.callBeforeInit()
        return super(varargs, cls).__new__(cls)
        #return object.__new__(cls)

    def __init__(self):
        print("in object indtansiation")

    @classmethod
    def callBeforeInit(cls):
        print("called before init")

v = varargs()