Reputation: 18585
In Python 2.x, all new-style classes inherit from object
implicitly or explicitly. Then look at this:
>>> class M(type):
... pass
...
>>> class A:
... __metaclass__ = M
...
>>> class B:
... pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>
Does this mean A
is a new-style class? But A
doesn't inherit from object
anyway, right?
>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>
OK, B
is a classic class, isn't it?
>>> isinstance(A, object)
True
>>> isinstance(B, object)
True
why are instances of both A
and B
instances of object
?
If B
is an instance of object
, then type(B)
wouldn't be classobj
, right?
Upvotes: 5
Views: 798
Reputation: 2518
About metaclasses you may read here: http://docs.python.org/reference/datamodel.html#customizing-class-creation. Generally metaclasses are intended to work with new style classes. When you write:
class M(type):
pass
and you use:
class C:
__metaclass__ = M
you will create a new style object because the way M is defined (default implementation uses type
to create a new-style class). You could always implement you own metaclass that would create old-style classes using types.ClassType
.
Upvotes: 5
Reputation: 2518
About slots you may read here http://docs.python.org/release/2.5.2/ref/slots.html, a fragment:
By default, instances of both old and new-style classes have a dictionary for attribute storage.
For new-style classes you may add __slots__
, then the per-object dictionary will not be created.
Upvotes: 1