Metaclasses broke in 2.2?

Guido van Rossum guido at python.org
Tue Aug 14 15:06:44 EDT 2001


> From: Drew Csillag <drew_csillag at geocities.com>

> Another question is: will you be able to inherit from C and get the same
> behavior as the current situation where ideally this would work:
> 
> class meta:
>     def __init__(self, klass, bases, dict):
>         pass
> 
> class foo:
>     __metaclass__ = meta
> print 'foo is', foo  # foo *is* an meta instance
> 
> class bar(foo): pass # dies here

This dies because your meta is a classic class.  If you make it a
new-style class by inheriting from object, it can be made to work by
defining a __new__ method on the meta class.

But normally you would inherit meta from type, wouldn't you?

> print 'bar is', bar  # would be lovely if bar was an instance of meta

Yes, this works.

Here's a small example that works in current CVS:

    class meta(object):
	def __new__(cls, name, bases, dict):
	    return object.__new__(cls)
	def __init__(self, name, bases, dict):
	    self.name, self.bases, self.dict = name, bases, dict
	def __repr__(self):
	    return "<meta instance %s>" % self.name

    class foo:
	__metaclass__ = meta

    print foo

    class bar(foo):
	pass

    print bar

> In this case, foo and bar are type objects, not instances of meta,
> which is what I'm looking to do.  Is this part of what you were saying
> about it not working yet, or has my head exploded without my knowledge
> and I'm overlooking the obvious?

Neither.  What's not working yet is that in certain cases overriding
__new__ causes an infinite loop, and I need to fix it. :-(

> I guess what I'm really trying to say is that for a library I
> currently have using 2.1, currently the user can be totally ignorant
> of the fact that they are not defining regular classes, but
> metaclasses, and ideally, I'd like to keep it that way.

If you can smuggle a "__metaclass__ = type" into their namespace, you
can get the same effect.

--Guido van Rossum (home page: http://www.python.org/~guido/)




More information about the Python-list mailing list