>>> class ClassicSpam: # no base class... pass>>> ClassicSpam.__bases__()
"new" style classes: they have, directly or indirectly (e.g inherit from a built-in type), object as a base class:
>>> class NewSpam(object): # directly inherit from object... pass>>> NewSpam.__bases__(<type 'object'>,)>>> class IntSpam(int): # indirectly inherit from object...... pass>>> IntSpam.__bases__(<type 'int'>,)>>> IntSpam.__bases__[0].__bases__ # ... because int inherits from object(<type 'object'>,)
Without a doubt, when writing a class you'll always want to go for new-style classes. The perks of doing so are numerous, to list some of them:
Support for descriptors. Specifically, the following constructs are made possible with descriptors:
classmethod: A method that receives the class as an implicit argument instead of the instance.
staticmethod: A method that does not receive the implicit argument self as a first argument.
properties with property: Create functions for managing the getting, setting and deleting of an attribute.
__slots__: Saves memory consumptions of a class and also results in faster attribute access. Of course, it does impose limitations.
The __new__ static method: lets you customize how new class instances are created.
Method resolution order (MRO): in what order the base classes of a class will be searched when trying to resolve which method to call.
If you don't inherit from object, forget these. A more exhaustive description of the previous bullet points along with other perks of "new" style classes can be found here.
One of the downsides of new-style classes is that the class itself is more memory demanding. Unless you're creating many class objects, though, I doubt this would be an issue and it's a negative sinking in a sea of positives.
Python 3.x story:
In Python 3, things are simplified. Only new-style classes exist (referred to plainly as classes) so, the only difference in adding object is requiring you to type in 8 more characters. This:
class ClassicSpam:pass
完全等同于(除了他们的名字:-):
class NewSpam(object):pass
并对此:
class Spam():pass
所有人都有object在他们的__bases__中。
>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}][True, True, True]