Я построил систему классов, которая использует несколько производных базового класса (object-> class1-> class2-> class3):
class class1(object):
def __init__(self):
print "class1.__init__()"
object.__init__(self)
class class2(class1):
def __init__(self):
print "class2.__init__()"
class1.__init__(self)
class class3(class2):
def __init__(self):
print "class3.__init__()"
class2.__init__(self)
x = class3()
Работает как положено и печатает:
class3.__init__()
class2.__init__()
class1.__init__()
Теперь я хотел бы заменить 3 строки
object.__init__(self)
...
class1.__init__(self)
...
class2.__init__(self)
на что-то вроде этого:
currentParentClass().__init__()
...
currentParentClass().__init__()
...
currentParentClass().__init__()
Итак, я хочу создать систему классов, в которой яне нужно вводить "classXYZ.doSomething ()".
Как уже упоминалось выше, я хочу получить «родительский класс текущего класса».
Замена трех строк на:
super(type(self), self).__init__()
НЕ работает (всегдавозвращает родительский класс текущего экземпляра -> class2) и приведет к печати бесконечного цикла:
class3.__init__()
class2.__init__()
class2.__init__()
class2.__init__()
class2.__init__()
...
Так есть ли функция, которая может дать мне родительский класс текущего класса?
Спасибо за помощь!
Генри
--------------------
Редактировать:
@ Леннарт хорошо, возможно, я вас неправильно понял, но в данный момент я думаю, что недостаточно четко описал проблему. Итак, этот пример может объяснить ее лучше:
позволяет создать еще один дочерний класс
class class4(class3):
pass
что теперь произойдет, если мы получим экземпляр из класса 4?
y = class4()
я думаю, что он явно выполняет:
super(class3, self).__init__()
, который мы можем перевести на это:
class2.__init__(y)
это определенно не цель (это было бы class3.__init__(y)
)
Теперь делаю много вызовов функций родительского класса - я не хочуРеализовать все мои функции с разными именами базовых классов в моих вызовах super ().
Я также хочу отметить, что я новичок в системе классов питонов, так что я надеюсь, что у вас естьтерпение со мной.