Is type object an instance or class?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • JH

    #1

    Is type object an instance or class?

    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(in t, object)
    True
    >>isinstance(in t, object)
    True
    >>print type(int)
    <type 'type'>
    >>isinstance(in t, type)
    True
    >>issubclass(in t, type)
    False
    >>issubclass(ty pe, object)
    True
    >>isinstance(ty pe, object)
    True
    >>isinstance(ob ject, type)
    True
    >>>
  • James Stroud

    #2
    Re: Is type object an instance or class?

    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:



    James

    Comment

    • Dan Bishop

      #3
      Re: Is type object an instance or class?

      On Feb 26, 8:00 pm, "JH" <john....@sover eign.co.nzwrote :
      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.

      Comment

      • Steven D'Aprano

        #4
        Re: Is type object an instance or class?

        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:



        A couple of more gentle introductions are here:

        Now, next, and beyond: Tracking need-to-know trends at the intersection of business and technology


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



        --
        Steven D'Aprano


        Comment

        • Peter Otten

          #5
          Re: Is type object an instance or class?

          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


          Comment

          • =?ISO-8859-1?Q?Ren=E9_Fleschenberg?=

            #6
            Re: Is type object an instance or class?

            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

            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(i nt, object)
            True
            All classes are subclasses of 'object'. 'int' is a class, so it is a
            subclass of 'object'.
            >>>isinstance(i nt, 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(i nt, type)
            True
            Since all classes are subclasses of 'object' and 'object' is an instance
            of 'type', all classes are instances of 'type'.
            >>>issubclass(i nt, type)
            False
            No reason why it should be. It could be, but it does not have to.
            >>>issubclass(t ype, object)
            True
            'type' is a class, all classes are subclasses of 'object'.
            >>>isinstance(t ype, object)
            True
            'type' is an object, all objects are instances of 'object'.
            >>>isinstance(o bject, type)
            True
            'object' is a class, all classes are instances of 'type'.


            Hope this helps ;)

            --
            René

            Comment

            Working...