New vs Old Style Python Classes in C Extensions?

Carl Banks pavlovevidence at gmail.com
Sat Jan 27 07:51:19 EST 2007


On Jan 27, 6:11 am, Jeff Rush <j... at taupro.com> wrote:
> While I have a reasonable understanding of the differences in new-style versus
> old-style classes, tonight while working a C extension module I realized I
> don't know how to indicate which style my C extension module should appear as.
>
> I'm following the Python docs for extended modules, but it doesn't say in
> there anyplace I can find which style I'm creating.  My clue that something
> was wrong is when this:
>
> 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, and -thats- when I realized I have
> no idea which my C extension implemented.
>
> Any enlightenment?

Short answer:

It has nothing to do with old-style classes, and is probably just due 
to a mistake in your extension.

Longer answer:

C extention types have never implemented old-style classes.  Before 
Python 2.2, classes and types were different things.  All class 
instances were of the same type.  However, C extension objects were a 
different type, and weren't class instances at all.

Nowadays, new-style classes are types, but the converse isn't 
necessary true.  In particular, the typical way of defining old 
extension types didn't work as a new-style type.  So, as part of type-
class unification, they added some new fields (tp_members, tp_new, and 
so on) and new idioms to replace some of the old idioms, effectively 
creating "new-style types".

Unless you've adopted the new ways, your type isn't going to work as a 
class.  If you have adopted the new ways, then it's probably just a 
mistake in your code.

I suspect you have adopted the new ways, because I'd expect Python to 
raise TypeError when trying to subclass a function.  So you probably 
just have a bug.


Carl Banks




More information about the Python-list mailing list