Super и __new__ Churnusion

Как то, что я только что узнал, я могу использовать Super () Таким образом:
Super (Class, OBJ_OF_CLASS-OR-_SUBCLASS_OF_CLASS)

код выходит ниже:

#Case 1
class A(object):
    def __init__(self):
        print "A init"

class B(A):
    def __init__(self):
        print "B init"
        super(B, self).__init__()  #ok, I can invoke A's __init__ successfully

#Case 2
class A(object):
    @classmethod
    def foo(cls):
        print "A foo"

class B(object):
    @classmethod
    def foo(cls):
        print "B foo"
        super(B, cls).foo()   #ok, I can invoke A's foo successfully

#Case 3
class A(object):
    def __new__(cls):
      print "A new"
      return super(A, cls).__new__(cls)

class B(A):
    def __new__(cls):
      print "B new"
      return super(B, cls).__new__()  #Oops, error

Вопрос:

В случае 1 и 2 я могу использовать супер успешно без указания OBJ или CLS для работы. Но почему я не могу сделать то же самое для __ новых __ ? Потому что, в случае 3, если я использую супер таким образом, я получил ошибку. Но если я использую это таким образом:

super(B, cls).__new__(cls)

Нет ошибки.

26
задан martineau 30 January 2018 в 13:49
поделиться

1 ответ

Из заметок о выпуске Python о переопределении метода __new__:

__new__ - это статический метод , а не метод класса. Сначала я думал, что это должен быть метод класса, и поэтому я добавил примитив classmethod. К сожалению, с методами класса upcalls не работают правильно в этом случае, поэтому мне пришлось сделать его статическим методом с явным классом в качестве первого аргумента.

Поскольку __new__ является статическим методом, super(...).__new__ возвращает статический метод. В этом случае нет связи cls с первым аргументом. Все аргументы должны быть указаны явно.

33
ответ дан 28 November 2019 в 07:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: