En Tue, 22 Jun 2010 23:45:07 -0300, John Nagle <na...@animats.com> escribió:

   I want to test whether an object is an instance of any user-defined
class.  "isinstance" is less helpful than one would expect.

 >>> import types
 >>> class foo() : # define dummy class
...     pass
...
 >>> x = foo()
 >>>
 >>> type(x)
<type 'instance'>
 >>>
 >>> isinstance(x, types.ClassType)
False
 >>> isinstance(x, types.InstanceType)
True
 >>> foo
<class __main__.foo at 0x004A2BD0>
 >>> x
<__main__.foo instance at 0x020080A8>

So far, so good. x is an InstanceType.  But let's try a
class with a constructor:

 >>> class bar(object) :
...    def __init__(self, val) :
...      self.val = val
...
 >>> b = bar(100)
 >>> b
<__main__.bar object at 0x01FF50D0>
 >>> isinstance(b, types.InstanceType)
False
 >>> isinstance(b, types.ClassType)
False
 >>>>>> bar
<class '__main__.bar'>

Without a constructor, we get an "instance".  With a constructor,
we get an "object", one which is not an InstanceType.

That's not the relevant difference. In the first case, you don't inherit from object; in the second one, you do.

foo is a "classic" class (or "old-style" class); x is an instance of foo, its *type* is InstanceType, its *class* is foo. All instances of any other classic class have the same type (InstanceType).

bar is a "new-style" class, b is an instance of bar, its type is bar, its class is bar. class and type are equivalent for new style classes; things are a lot more regular and predictable. In Python 3.x classic classes are gone.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to