Message9997
Logged In: YES
user_id=56214
class cm1(object):
def cmm(klass):
print klass
cmm = classmethod(cmm)
class cm2(cm1):
def cmm(klass):
super(cm2,klass).cmm()
cmm = classmethod(cmm)
cm2.cmm()
The above code prints "<classmethod object at 0x00A9B930>",
demonstrating that super(cm2,klass).cmm is bound improperly.
(It should print <class '__main__.cm2'>, analagous to how
calling cm1.cmm() directly prints <class '__main__.cm1'>.)
You can more specifically verify this like so:
>>> cm1.cmm.im_self
<class '__main__.cm1'>
>>> cm2.cmm.im_self
<class '__main__.cm2'>
>>> super(cm2,cm2).cmm.im_self
<classmethod object at 0x00A9B930>
>>>
The last item's im_self should of course be <class
'__main__.cm2'>. As I said, the problem is that
super_getattro incorrectly asks the classmethod descriptor
to bind to *itself*, rather than to a type.
Note that if you use the pure Python example version of
"super" defined in the python.org/2.2/descrintro.html
document, the above examples work correctly as long as you
use a version of Python that has the "classmethod core dump"
problem fixed. However, the builtin super() never works
correctly for classmethods, whether the "classmethod core
dump" is fixed or not.
|
|
Date |
User |
Action |
Args |
2007-08-23 14:00:09 | admin | link | issue535444 messages |
2007-08-23 14:00:09 | admin | create | |
|