Во-первых, извинения за долгое объяснение.
Версия # 1 - Код: декоратор класса для класса
class A(object):
def __init__(self, klass):
print "A::__init__()"
self._klass = klass
def __call__(self):
print "A::__call__()"
return self._klass()
def __del__(self):
print "A::__del__()"
@A
class B(object):
def __init__(self):
print "B::__init__()"
def main():
b = B()
if __name__ == "__main__":
main()
Версия №1 - Вывод:
A::__init__()
A::__call__()
B::__init__()
A::__del__()
Версия №2 - Код: декоратор класса для производного класса, который явно инициализирует базовые классы.
class A(object):
def __init__(self, klass):
print "A::__init__()"
self._klass = klass
def __call__(self):
print "A::__call__()"
return self._klass()
def __del__(self):
print "A::__del__()"
class Parent1(object):
def __init__(self):
print "Parent1:: __init__()"
super(Parent1, self).__init__()
class Parent2(object):
def __init__(self):
print "Parent2:: __init__()"
super(Parent2, self).__init__()
@A
class B(Parent1, Parent2):
def __init__(self):
print "B::__init__()"
# super(B, self).__init__()
Parent1.__init__(self)
Parent2.__init__(self)
def main():
b = B()
if __name__ == "__main__":
main()
Версия №2 - Вывод:
A::__init__()
A::__call__()
B::__init__()
Parent1:: __init__()
Parent2:: __init__()
Parent2:: __init__()
A::__del__()
Версия №3 - Код: декоратор класса для производного класса с super()
class A(object):
def __init__(self, klass):
print "A::__init__()"
self._klass = klass
def __call__(self):
print "A::__call__()"
return self._klass()
def __del__(self):
print "A::__del__()"
class Parent1(object):
def __init__(self):
print "Parent1:: __init__()"
super(Parent1, self).__init__()
class Parent2(object):
def __init__(self):
print "Parent2:: __init__()"
super(Parent2, self).__init__()
@A
class B(Parent1, Parent2):
def __init__(self):
print "B::__init__()"
super(B, self).__init__()
def main():
b = B()
if __name__ == "__main__":
main()
Версия №3 - Вывод:
A::__init__()
A::__call__()
B::__init__()
Traceback (most recent call last):
File "so.py", line 40, in <module>
main()
File "so.py", line 36, in main
b = B()
File "so.py", line 10, in __call__
return self._klass()
File "so.py", line 32, in __init__
super(B, self).__init__()
TypeError: must be type, not A
A::__del__()
Вопрос:
Версия №1 предназначена только для справки. Он объясняет, что я пытаюсь сделать, то есть захватить creation
и deletion
объектов class B
.
В версии № 2 я пробовал то же самое для объектов class B
, которые являются производными от Parent1
и Parent2
, которые инициализируются явно с использованием Parent1.__init__(self)
и Parent2.__init__(self)
, которые отлично работают, как и ожидалось.
Но в версии №3 я пробовал то же самое с методом super()
. Но получаю следующую ошибку - TypeError: must be type, not A
. Я думаю, это потому, что метод __init__()
для всех родительских классов в цепочке MRO
не вызывается должным образом. Почему? И как мне это исправить?