New vs Old Style Python Classes in C Extensions?

"Martin v. Löwis" martin at v.loewis.de
Sat Jan 27 07:34:39 EST 2007


Jeff Rush schrieb:
> from cextension import Context
> 
> class MyContext(Context):
> 
>     def __init__(self):
>         super(Context, self).__init__()
> 
> repeatedly and reliably failed with a corrupted C data structure, while
> this:
> 
> class MyContext(Context):
> 
>     def __init__(self):
>         Context.__init__()
> 
> worked without any problems.  As I understand it, the former uses
> new-style semantics while the latter uses old-style, 

This understanding is incorrect: Context is either a new-style
or an old-style class (if type(Context) is type, it's a new-style
class, if type(context) is named 'classobj', it's an old-style
class).

As you have implemented Context in an extension module, it likely
is a new-style class (i.e. a type).

Most likely, something is wrong with your tp_init slot. You
shouldn't be able to call Context.__init__(): that should
raise a type error, indicating that an object is needed
for the method __init__. That should hold whether Context
is a new-style or an old-style class.

HTH,
Martin



More information about the Python-list mailing list