[Python-Dev] How to suppress instance __dict__?

Joel de Guzman joel@boost-consulting.com
Tue, 1 Apr 2003 16:56:34 +0800

Dave Abrahams wrote:

>> I am generating extension types derived from a type which is derived
>> from int 'int' by calling the metaclass; in order to prevent instances
>> of the most-derived type from getting an instance _dict_ I am
>> putting an empty tuple in the class _dict_ as '_slots_'.  The
>> problem with this hack is that it disables pickling of these babies:
>>    "a class that defines _slots_ without defining _getstate_
>>     cannot be pickled"

Guido van Rossum wrote:

> Yes.  I was assuming you'd do this at the C level.  To do what I
> suggested in Python, I think you'd have to write this:
>     class M(type):
>         def __new__(cls, name, bases, dict):
>     C = type.__new__(cls, name, bases, dict)
>     del C.__getstate__
>     return C


Ok, I'm lost. Please be easy with me, I'm still learning the C API
interfacing with Python :) Here's what I have so far. Emulating the 
desired behavior in Python, I can do:

    class EnumMeta(type):
        def __new__(cls, name, bases, dict):
            C = type.__new__(cls, name, bases, dict)
            del C.__getstate__
            return C
    class Enum(int):
        __metaclass__ = EnumMeta
        __slots__ = ()
    x = Enum(1964)
    print x
    import pickle
    print "SAVING"
    out_x = pickle.dumps(x)
    print "LOADING"
    xl = pickle.loads(out_x)
    print xl

I'm trying to rewrite this in C/C++ with the intent to patch 
Boost.Python to allow pickling on enums. I took on this task to
learn more about the low level details of Python C interfacing.    
So far, I have implemented EnumMeta in C that does not override
anything yet and installed that as the metaclass of Enum.

I was wondering... Is there some C code somewhere that I can see
that implements some sort of meta-stuff? I read PEP253 and 253
and "Unifying Types and Classes in Python 2.2". The examples 
there (specifically the class autoprop) is written in Python. I tried
searching for examples in C from the current CVS snapsot of 2.3
but I failed in doing so. I'm sure it's there, but I don't know where
to find.

To be specific, I'm lost in trying to implement tp_new of PyTypeObject. 
How do I call the default tp_new for metaclasses? 

Joel de Guzman
joel at boost-consulting.com