Is type object an instance or class?

Discussion in 'Python' started by JH, Feb 27, 2007.

  1. JH

    JH Guest

    Hi

    I found that a type/class are both a subclass and a instance of base
    type "object".

    It conflicts to my understanding that:

    1.) a type/class object is created from class statement
    2.) a instance is created by "calling" a class object.

    A object should not be both a class and an instance at the same time.

    Further I found out there is a special type call "type" that is a
    subclass of base type "object". All other types are instances of this
    type. Even base type "object" is an instance of this special type.

    What is role of this type "type" in object creation? Could someone
    there straighten this concept a little?

    For example (Python2.5):

    >>> issubclass(int, object)

    True
    >>> isinstance(int, object)

    True
    >>> print type(int)

    <type 'type'>
    >>> isinstance(int, type)

    True
    >>> issubclass(int, type)

    False
    >>> issubclass(type, object)

    True
    >>> isinstance(type, object)

    True
    >>> isinstance(object, type)

    True
    >>>
     
    JH, Feb 27, 2007
    #1
    1. Advertising

  2. JH

    James Stroud Guest

    JH wrote:
    > Hi
    >
    > I found that a type/class are both a subclass and a instance of base
    > type "object".
    >
    > It conflicts to my understanding that:
    >
    > 1.) a type/class object is created from class statement
    > 2.) a instance is created by "calling" a class object.
    >
    > A object should not be both a class and an instance at the same time.
    >
    > Further I found out there is a special type call "type" that is a
    > subclass of base type "object". All other types are instances of this
    > type. Even base type "object" is an instance of this special type.
    >
    > What is role of this type "type" in object creation? Could someone
    > there straighten this concept a little?
    >
    > For example (Python2.5):
    >
    >
    >>>>issubclass(int, object)

    >
    > True
    >
    >>>>isinstance(int, object)

    >
    > True
    >
    >>>>print type(int)

    >
    > <type 'type'>
    >
    >>>>isinstance(int, type)

    >
    > True
    >
    >>>>issubclass(int, type)

    >
    > False
    >
    >>>>issubclass(type, object)

    >
    > True
    >
    >>>>isinstance(type, object)

    >
    > True
    >
    >>>>isinstance(object, type)

    >
    > True
    >
    >


    Here is a primer on the topic:

    http://www.python.org/download/releases/2.2/descrintro/

    James
     
    James Stroud, Feb 27, 2007
    #2
    1. Advertising

  3. JH

    Dan Bishop Guest

    On Feb 26, 8:00 pm, "JH" <> wrote:
    > Hi
    >
    > I found that a type/class are both a subclass and a instance of base
    > type "object".
    >
    > It conflicts to my understanding that:
    >
    > 1.) a type/class object is created from class statement
    > 2.) a instance is created by "calling" a class object.
    >
    > A object should not be both a class and an instance at the same time.
    >
    > Further I found out there is a special type call "type" that is a
    > subclass of base type "object". All other types are instances of this
    > type. Even base type "object" is an instance of this special type.


    Yes. Python has a much broader definition of "object" than say, Java
    does. Functions are objects. Modules are objects. And most relevant
    here, types are objects. So "int" and even "object" are objects, and
    they have type "type".

    Confusing, I know, but perfectly logical.
     
    Dan Bishop, Feb 27, 2007
    #3
  4. On Mon, 26 Feb 2007 18:00:00 -0800, JH wrote:

    > A object should not be both a class and an instance at the same time.


    Why ever not?

    A meta-class is a class (or at least a class-like object) whose instances
    are themselves classes. Under the hood, Python uses meta-classes
    extensively. Most Python developers probably never need to use it, but if
    you want your head to explode, read this:

    http://www.python.org/doc/essays/metaclasses/

    A couple of more gentle introductions are here:
    http://www.python.org/doc/essays/metaclasses/meta-vladimir.txt
    http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

    Me, I think I'll stick to class factories.



    --
    Steven D'Aprano
     
    Steven D'Aprano, Feb 27, 2007
    #4
  5. JH

    Peter Otten Guest

    JH wrote:

    > I found that a type/class are both a subclass and a instance of base
    > type "object".
    >
    > It conflicts to my understanding that:
    >
    > 1.) a type/class object is created from class statement
    > 2.) a instance is created by "calling" a class object.
    >
    > A object should not be both a class and an instance at the same time.


    A class should be an instance. Now what?

    > Further I found out there is a special type call "type" that is a
    > subclass of base type "object". All other types are instances of this
    > type. Even base type "object" is an instance of this special type.
    >
    > What is role of this type "type" in object creation? Could someone
    > there straighten this concept a little?


    The type of a class is called metaclass. The creation of a class is the same
    as an instantiation of its metaclass. You can therefore write

    class A(object):
    answer = 42

    as

    A = type("A", (object,), dict(answer=42))

    So now we know how to make a class from a metaclass, how can we make a
    metaclass? The tailbiting answer is that a metaclass is a class, too.

    Can you figure out the result of isinstance(type, type)?

    Peter
     
    Peter Otten, Feb 27, 2007
    #5
  6. Hi

    The article you read at
    http://www.cafepy.com/article/python_types_and_objects is really good,
    and the most comprehensive one I know about Python's object system. I
    recommend that you read it as many times as you need to understand it.
    It can be confusing -- just don't give up ;)

    I will try to give some answers to your questions. Note that I assume we
    are only speaking of new-style classes. Old-style classes are different,
    but pretty uninteresting since there is little reason to use them in new
    code.

    Another note: As far as this stuff in Python is concerened, "type" and
    "class" are, to my knowledge, basically just two different names for the
    same thing.

    JH schrieb:
    > Hi
    > http://www.cafepy.com/article/python_types_and_objects/
    > I found that a type/class are both a subclass and a instance of base
    > type "object".
    >
    > It conflicts to my understanding that:
    >
    > 1.) a type/class object is created from class statement
    > 2.) a instance is created by "calling" a class object.


    Why? I see no conflict here.

    > A object should not be both a class and an instance at the same time.


    It should.

    1) Everything is an object.
    2) Every object is an instance of a class.

    From this, it logically follows that every class should also be an
    instance of a class. Classes are objects, and objects are instances of
    classes.

    > Further I found out there is a special type call "type" that is a
    > subclass of base type "object". All other types are instances of this
    > type. Even base type "object" is an instance of this special type.
    >
    > What is role of this type "type" in object creation? Could someone
    > there straighten this concept a little?


    I) object' is the root of the inheritance hierarchy. All classes inherit
    from 'object'. 'object' is its own baseclass. Also, all objects are
    instances of 'object'.

    II) 'type' is the root of the type hierarchy. All types (i.e. classes)
    are subtypes of 'type'. 'type' is its own type.
    Because 'type' also is, like everything else, an object, it is an
    instance of 'object' (see I). Because it is a type object (a class), it
    also is a subclass of 'object' (again, see I).

    Objects are created by instantiating their class/type. Classes (also
    called "type objects") are usually created by instantiating 'type'.

    The object you instantiate to get a class is called that class'
    "metaclass". One can just as well call it that class' type.

    Unless you specify something else, the metaclass is 'type'. Sometimes it
    can be useful to not use the default 'type' as a metaclass, but a class
    that inherits from 'type'.

    class A(type):
    # Custom code here.
    pass

    class B(object):
    __metaclass__ = A

    type(B) # A. We overrode the metaclass.
    type(type(B)) # 'type'. The default metaclass.


    > For example (Python2.5):
    >
    >>>> issubclass(int, object)

    > True


    All classes are subclasses of 'object'. 'int' is a class, so it is a
    subclass of 'object'.

    >>>> isinstance(int, object)

    > True


    All objects are instances of 'object', and 'int' is an object.

    >>>> print type(int)

    > <type 'type'>


    'type' is the default type for classes (the "metaclass"). In the case of
    'int', that default was not changed.

    >>>> isinstance(int, type)

    > True


    Since all classes are subclasses of 'object' and 'object' is an instance
    of 'type', all classes are instances of 'type'.

    >>>> issubclass(int, type)

    > False


    No reason why it should be. It could be, but it does not have to.

    >>>> issubclass(type, object)

    > True


    'type' is a class, all classes are subclasses of 'object'.

    >>>> isinstance(type, object)

    > True


    'type' is an object, all objects are instances of 'object'.

    >>>> isinstance(object, type)

    > True


    'object' is a class, all classes are instances of 'type'.


    Hope this helps ;)

    --
    René
     
    =?ISO-8859-1?Q?Ren=E9_Fleschenberg?=, Feb 27, 2007
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Sridhar R
    Replies:
    14
    Views:
    1,425
    =?iso-8859-1?Q?Fran=E7ois?= Pinard
    Feb 10, 2004
  2. Gerry Sutton
    Replies:
    1
    Views:
    557
    Peter Otten
    Apr 16, 2005
  3. Gerard Flanagan
    Replies:
    3
    Views:
    458
    Terry Hancock
    Nov 19, 2005
  4. Daniel Lipovetsky
    Replies:
    2
    Views:
    351
    Jordan Greenberg
    Mar 12, 2007
  5. Martin P. Hellwig
    Replies:
    1
    Views:
    380
    Martin P. Hellwig
    Mar 26, 2010
Loading...

Share This Page