[Tutor] Class decorator on a derived class not initialising the base classes using super - TypeError
Sangeeth Saravanaraj
sangeeth.saravanaraj at gmail.com
Mon Feb 24 17:52:52 CET 2014
I am trying to capture an object initiation and deletion events using the
__call__() and __del__() methods with the following approach.
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()
I decorate a class, say class B (whose object initiation and deletion I
wanted to capture) with a decorator class A. Please note that the class B
is derived from two classes - Parent1 & Parent2 and I want to use super()
method to initialise the parent classes.
When I executed the above code snippet, I ran into the following issue:
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__()
When I commented "super(B, self).__init__()" in the class B :: __init__()
method, it returned an object of type B and I was able to see the prints in
the __call__ and __del__ methods but the __init__() methods of the base
classes (Parent1 & Parent2) are not called!
>From the error message, what I could understand is - the object returned by
A::__call__() is not of type B but of type A. But when I put a print in the
A::__call__() I could see it returns an object of type B and not A.
Now the question is - With this approach to capture the initiation and
deletion events of an object, how do I initialise the base classes using
super()?
Or, is there any other better way to capture the __call__ and __del__
events for an object of a certain class - if so, how?!
Thank you,
Sangeeth
PS:
http://stackoverflow.com/questions/21826854/typeerror-when-using-super-method-with-class-decorator-for-a-derived-class
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20140224/fa537778/attachment-0001.html>
More information about the Tutor
mailing list