Struct usages in Python

Arnaud Delobelle arnodel at googlemail.com
Wed May 28 13:53:41 EDT 2008


Arnaud Delobelle <arnodel at googlemail.com> writes:

> "Alex Gusarov" <alex.m.gusarov at gmail.com> writes:
>
>>>  class Event(object):
>>>
>>> Always subclass object, unless you have a very compelling reason not to,
>>> or you are subclassing something else.
>>>
>>
>> I've thought that if I write
>>
>> class Event:
>>     pass
>>
>> , it'll be subclass of object too, I was wrong?
>
> You are wrong for Python 2.X, but right for Python 3 where old-style
> classes are gone for good.
>
> What you define with the statement
>
>     class Event: pass
>
> is an 'old-style' class.  Witness:
>
>     >>> class Event: pass
>     ... 
>     >>> class NewEvent(object): pass
>     ... 
>     >>> type(Event)
>     <type 'classobj'>
>     >>> type(NewEvent)
>     <type 'type'>
>     >>> type(Event())
>     <type 'instance'>
>     del>>> type(NewEvent())
>     <class '__main__.NewEvent'>
>
> All old-style classes are actually objects of type 'classobj' (they
> all have the same type!), all their instances are all of type 'instance'.

Oops somthing disappeared in the copy/paste process:

    >>> class FooBar: pass
    ...

>     >>> type(FooBar) == type(Event)
>     True
>     >>> type(FooBar()) == type(Event())
>     True
>
> Whereas instances of new-style classes are of type their class:
>
>     >>> class NewFooBar(object): pass
>     ... 
>     >>> type(NewFooBar) == type(NewEvent)
>     True
>     >>> type(NewFooBar()) == type(NewEvent())
>     False
>
> However, in python 2.X (X > 2?), you can force all classes to of a
> certain type by setting the global variable '__metaclass__'. So:
>
>     >>> type(Event) # Event is an old-style class
>     <type 'classobj'>
>     >>> __metaclass__ = type
>     >>> class Event: pass
>     ... 
>     >>> type(Event) # Now Event is new-style!
>     <type 'type'>
>
> HTH
>
> -- 
> Arnaud



More information about the Python-list mailing list