Кажется, в более старых версиях Python вы можете передать аргументы супер, но не более. Что делать, если SuperClass выполняет какую-то настройку с использованием своих аргументов?
Я думаю, вы неправильно поняли, какие аргументы вы можете оставить в 3.x. В Python 2.x, вы необходимо передать аргументы super
, чтобы получить корректно связанный метод:
class MyClass(...):
def __init__(self, ...):
super(MyClass, self).__init__(...)
#^these arguments ^not these
В 3.x, вы не требуется поставить эти аргументы, вы можете просто позвоните по номеру super().method(...)
, но он примет их в порядке.
Это то же самое, что и поведение с унаследованием object
- вы должны сделать это, чтобы получить класс нового стиля в 2.x, но 3.x создаст класс нового стиля независимо от того, явно ли вы наследуете object
.
В любом случае, вы можете передать аргументы метода на super
. Так что, если вы пишете только для 3.x, вы могли бы сделать что-то вроде:
class MyClass(SuperClass):
def __init__(self, super_arg, my_arg):
super().__init__(super_arg)
#^don't need these
#^still need these
self.my_arg = my_arg
Если наследование от объекта, я должен назвать супер?
Да, потому что вы можете участвовать в множественном наследовании. Сравните:
>>> class SuperClass1(object):
def __init__(self):
print("SuperClass1.__init__")
>>> class SuperClass2(object):
def __init__(self):
print("SuperClass2.__init__")
>>> class MyClass(SuperClass1, SuperClass2):
def __init__(self):
print("MyClass.__init__")
super(MyClass, self).__init__()
>>> MyClass()
MyClass.__init__
SuperClass1.__init__
<__main__.MyClass object at 0x02D0CC50>
с:
>>> class SuperClass1(object):
def __init__(self):
print("SuperClass1.__init__")
super(SuperClass1, self).__init__()
>>> class SuperClass2(object):
def __init__(self):
print("SuperClass2.__init__")
super(SuperClass2, self).__init__()
>>> class MyClass(SuperClass1, SuperClass2):
def __init__(self):
print("MyClass.__init__")
super(MyClass, self).__init__()
>>> MyClass()
MyClass.__init__
SuperClass1.__init__
SuperClass2.__init__
<__main__.MyClass object at 0x02BCDC10>
В первом, потому что SuperClass1
не вызывает super
, SuperClass2.__init__
никогда не будет достигнута.
ли это обрабатывается по-разному в Python 2.7 против 3.x?
Надеюсь, теперь это ясно, - вы должны быть более четко 2.x (или, если вы пишете код, который должен работать в обеих версиях), но в остальном функциональность идентична, и вы должны позвонить super
в все уровни в обоих.
* «передать аргументы супер» * - вы имеете в виду 'супер (здесь) .method()' или 'super(). Method (here)'? – jonrsharpe
'super (SuperClass, self) .__ init __ (super_argument)' или 'super (SuperClass, self, super_argument) .__ init __()' –
Это немного бесполезно, потому что то, что вы там сделали, включает в себя оба набора аргументов, а не укажите *, о которых вы спрашиваете! * Вы можете оставить «SuperClass, self», если вы пишете * только * для 3.x, но 'super_argument' по-прежнему используется по-прежнему. – jonrsharpe