Как то, что я только что узнал, я могу использовать 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)
Нет ошибки.
Из заметок о выпуске Python о переопределении метода __new__
:
__new__
- это статический метод , а не метод класса. Сначала я думал, что это должен быть метод класса, и поэтому я добавил примитив classmethod. К сожалению, с методами класса upcalls не работают правильно в этом случае, поэтому мне пришлось сделать его статическим методом с явным классом в качестве первого аргумента.
Поскольку __new__
является статическим методом, super(...).__new__
возвращает статический метод. В этом случае нет связи cls
с первым аргументом. Все аргументы должны быть указаны явно.