[Tutor] New-style classes

Gonçalo Rodrigues op73418 at mail.telepac.pt
Sun Nov 2 14:09:45 EST 2003

On Sat, 1 Nov 2003 11:12:48 -0800 (PST), you wrote:

>I have heard about new-style classes, and I'm afraid
>I'm using old-style classes (since I'm learning from a
>book made for 2.0). Could somebody please explain what
>new-style classes are and their benefit over old-style

For most of the programming problems there is no difference in using
either old-style or new-style classes.

Lloyd Kvam has already posted some references. Let me add a few things
-- this is all advanced stuff so I'll be short and cryptic :-)

- There are some notable differences, between old-style and new-style
classes. One has to do with special __*__ name lookup. Consider the
following example:

>>> #An old style class
>>> class Test:
... 	pass
>>> a = Test()
>>> def it(self):
... 	yield None
>>> import types
>>> print types.MethodType.__doc__
instancemethod(function, instance, class)

Create an instance method object.

>>> #Sticking an __iter__ iterator method on the *instance* itself.
>>> a.__iter__ = types.MethodType(it, a, a.__class__)
>>> iter(a)
<generator object at 0x01120BC0>
>>> for elem in a:
... 	print elem
>>> #A new-style class
>>> class TestNew(object):
... 	pass
>>> b = TestNew()
>>> #Sticking an __iter__ iterator method on the *instance* itself.
>>> b.__iter__ = types.MethodType(it, b, b.__class__)
>>> iter(b)
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
TypeError: iteration over non-sequence

I'll leave you to ponder on what's happening here.

- One other difference has to do with how Python linearizes the graph
of super classes of a given class. For new-style classes the C3 order
is used (from 2.3 onward) - there is an article somewhere in the net
by S. Pedroni I believe explaining this. But only with some contrived
inheritance graphs you'd notice the difference :-)

- There are some distinct advantages in using new-style classes.
Besides being able to subclass (almost all) builtin types you can use
features like super, properties and metaclasses. All advanced stuff,
as I said.

With my best regards,
G. Rodrigues

More information about the Tutor mailing list