【发布时间】:2014-03-16 14:49:23
【问题描述】:
首先,对冗长的解释表示歉意。
版本 #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 仅供参考。它解释了我想要做什么,即捕获class B 的对象的creation 和deletion。
在版本 #2 中,我尝试了相同的 class B 对象,该对象派生自 Parent1 和 Parent2,它们使用 Parent1.__init__(self) 和 Parent2.__init__(self) 显式初始化,可以正常工作。
但在第 3 版中,我已经尝试过使用 super() 方法。但我收到以下错误 - TypeError: must be type, not A。我认为这是因为 MRO 链中所有父类的 __init__() 方法没有正确调用 - 为什么?而且,我该如何解决这个问题?
【问题讨论】:
-
已经在这里回答了:stackoverflow.com/a/2543256/705086 这是 Alex Martelli,你可以相信那个人! :)
标签: python decorator python-decorators