[Python-Dev] Re: super() harmful?
Phillip J. Eby
pje at telecommunity.com
Thu Jan 6 18:44:58 CET 2005
At 02:46 AM 1/6/05 -0500, James Y Knight wrote:
>To fix #1, it would be really nice if you could write code something like
>the following snippet. Notice especially here that the 'bar' argument gets
>passed through C.__init__ and A.__init__, into D.__init__, without the
>previous two having to do anything about it. However, if you ask me to
>detail how this could *possibly* *ever* work in python, I have no idea.
>Probably the answer is that it can't.
>
>class A(object):
> def __init__(self):
> print "A"
> next_method
>
>class B(object):
> def __init__(self):
> print "B"
> next_method
Not efficiently, no, but it's *possible*. Just write a 'next_method()'
routine that walks the frame stack and self's MRO, looking for a
match. You know the method name from f_code.co_name, and you can check
each class' __dict__ until you find a function or classmethod object whose
code is f_code. If not, move up to the next frame and try again. Once
you know the class that the function comes from, you can figure out the
"next" method, and pull its args from the calling frame's args, walking
backward to other calls on the same object, until you find all the args you
need. Oh, and don't forget to make sure that you're inspecting frames that
have the same 'self' object.
Of course, the result would be a hideous evil ugly hack that should never
see the light of day, but you could *do* it, if you *really really* wanted
to. And if you wrote it in C, it might be only 50 or 100 times slower than
super(). :)
More information about the Python-Dev
mailing list