any ways to judge whether an object is initilized or not in a class

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Tue Mar 20 05:28:10 EDT 2007


Steven D'Aprano a écrit :
> On Mon, 19 Mar 2007 19:48:37 +1100, Ben Finney wrote:
> 
>> It's also best to inherit every class from another class, leading to a
>> single hierarchy for all classes and types. 'object' is the one to
>> choose if you don't want the behaviour of any other class.
> 
> What's wrong with old-style classes?

Almost everything. That's why Python 2.2 introduced new-style classes. 
IIRC it was some 6 years ago now.

> On the plus side:
> 
> - Why inherit from something if you don't need to?

You don't have to inherit. You can also make a class new-style by 
setting it's __metaclass__ attribute properly. But that's more typing !-)

> - Less typing.

Lol. Six keystrokes in the worst case.

> - Attribute-lookup is much faster, perhaps as much as twice as fast.
> http://www.python.org/~jeremy/weblog/030506.html

This was in 2003. Did you bother testing now ? with Python 2.4.4:

 >>> class Old:
...     def __init__(self):
...             self.attr = "old"
...
 >>> class New(object):
...     def __init__(self):
...             self.attr = "new"
...
 >>> from timeit import Timer
 >>> told = Timer('old.attr', 'from __main__ import Old; old=Old()')
 >>> tnew = Timer('new.attr', 'from __main__ import New; new=New()')
 >>> told.repeat()
[0.40867519378662109, 0.39075493812561035, 0.38998913764953613]
 >>> tnew.repeat()
[0.58840394020080566, 0.5948030948638916, 0.36941695213317871]

Not really "twice as fast" AFAICT.

Now if you're really favor raw speed over expressivity, then you might 
wan to choose another language.

> 
> - Documentation on old style classes is more extensive.

Since new-style classes are backward compatible with old-style ones, 
almost all the old-style classes documentation applies to new-style ones 
as well. Everything else is quite well documented too:
http://www.python.org/doc/newstyle/

> - You can't use new style classes for exceptions.

Exceptions are new-style classes in 2.5.

> 
> 
> On the minus side:
> 
> - Properties don't work as you expect them too.

properties don't work. Period. Properties rely on the descriptor 
protocol, which only works with new-style classes.

> - Slots don't work at all.
> 
  - no support for the descriptor protocol
  - no __getattribute__
  - no metaclasses
  - no proper constructor
  - no classmethod
  - no super()

> In other words, the only reason why you HAVE to use a new style class is
> that you need properties or __slots__.

The reason why you have to use new-style classes is that it's the 
official Python object model since december 2001 - old-style classes 
being kept for compatibility. The reason why you want to use them is 
that they provide everything old-style classes did, and *way much more*. 
FWIW, if Python didn't have this powerful object model, I would have 
switched to another language long ago. And I'm probably not the only one.

> You might WANT to use a new style
> class to inherit from built-in types. 

Since builtin types are all new-style classes, any class inheriting from 
a builtin is a new-style class. FWIW, that's one of the reason for the 
object model changes way back in 2001.

> Otherwise, the choice between old
> and new is not very important.

Your opinion. Too bad you're missing some of the most powerful parts of 
the language.



More information about the Python-list mailing list