[Python-Dev] Requesting that a class be a new-style class
Alex Martelli
aleax at aleax.it
Sun Feb 20 09:15:25 CET 2005
On 2005 Feb 20, at 04:35, Jack Diederich wrote:
> I always use new style classes so I only have to remember one set of
> behaviors.
I agree: that's reason #1 I recommend always using new-style whenever I
teach / tutor / mentor in Python nowadays.
> "__metaclass__ = type" is warty, it has the "action at a distance"
> problem that
> decorators solve for functions.
I disagree. I view it as akin to a "from __future__ import" except
that -- since the compiler doesn't need-to-know, as typeclass-picking
happens at runtime -- it was accomplished by less magical and more
flexible means.
> I didn't dig into the C but does having 'type'
> as metaclass guarantee the same behavior as inheriting 'object' or
> does object
> provide something type doesn't? *wince*
I believe the former holds, since for example:
>>> class X: __metaclass__ = type
...
>>> X.__bases__
(<type 'object'>,)
If you're making a newstyle class with an oldstyle base, it's different:
>>> class Y: pass
...
>>> class X(Y): __metaclass__ = type
...
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Error when calling the metaclass bases
a new-style class can't have only classic bases
in this case, you do need to inherit object explicitly:
>>> class X(Y, object): pass
...
>>> X.__bases__
(<class __main__.Y at 0x38d330>, <type 'object'>)
>>> type(X)
<type 'type'>
This is because types.ClassType turns somersaults to enable this: in
this latter construct, Python's mechanisms determine ClassType as the
metaclass (it's the metaclass of the first base class), but then
ClassType in turn sniffs around for another metaclass to delegate to,
among the supplied bases, and having found one washes its hands of the
whole business;-).
Alex
More information about the Python-Dev
mailing list