relationship between between type and object in python

  • Last Update :
  • Techknowledgy :

The relationship between type(x) is basically the same as the result of x.__class__:

for obj in (object, type, 1, str):
   assert type(obj) is obj.__class__

print("type(obj) and obj.__class__ gave the same results in all test cases")

__bases__ represents the bases that a class is derived from:

class parent:

class child(parent,int):

print(child.__bases__) # prints (<class '__main__.parent'>, <class 'int'>)

however if you are asking about the odd relationship between object and type:

   # are `object`
   and `type`
   both instances of the `object`
   class ?
   isinstance(object, object) and isinstance(type, object)
   # are they also instances of the `type`
   class ?
   isinstance(object, type) and isinstance(type, type)
   # `type`
   is a subclass of `object`
   and not the other way around(this makes sense) >>>
      [issubclass(type, object), issubclass(object, type)]
      [True, False]

actually it may be better represented as:

#this isn 't available in python
class superTYPE(type):
   def __instancecheck__(cls, inst):
   if inst in (TYPE, OBJECT):
   return True
   return NotImplemented #for this demo

class OBJECT(metaclass = superTYPE):


Let's look at the turtles, first:

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

How is object an instance of type, when type is an instance of object? That feels like saying something like:

class Parrot: pass

ex = Parrot()

isinstance(ex, Parrot)
isinstance(Parrot, ex)

Should be True both times. But obviously it's not. Even (as Tadhg McDonald-Jensen pointed out)

>>> isinstance(type, type)

Which makes sense, if you think about it - you may have created class-level variables:

>>> class Counter:
... count = 0
... def __init__(self):
... Counter.count += 1
... print(self.count)
>>> Counter()
<__main__.Counter object at 0x7fa03fca4518>
   >>> Counter()
   <__main__.Counter object at 0x7fa03fca4470>
      >>> Counter()
      <__main__.Counter object at 0x7fa03fca4518>
         >>> Counter()
         <__main__.Counter object at 0x7fa03fca4470>
            >>> Counter.count
            >>> Counter.__repr__(Counter)
            '<type object at 0x1199738>'

But as this last example shows (and is mentioned in the post), a class declaration, what you get with class SomeClass: pass, that declaration of a class is actually an instance of another class. In particular, it's an instance of the type class. And that instance (which we call a class) when called will produce an instance of itself:

>>> Counter.__call__()
   __main__.Counter object at 0x7fa03fca4518 >

Each is an instance of the other:

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

With respect to subclassing, a type is a kind of object, but not vice versa:

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

I think of object() as providing the baseline capabilities for all objects:

>>> dir(object)['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

Then type() inherits from object(), but overrides several critical methods for creating classes:

for methname in dir(type):
   if 'type' in repr(getattr(type, methname, '')):


For beginners in python knowing that both str and repr exist is really useful: when you print data it uses str and when you evaluate stuff on the command line it uses repr which is mostly noticeable with strings:

>>> x = "123" >>>
   print(x) # prints string as is which since it contains digits is misleading
   x # shows "official"
representation of x with quotes to indicate it is a string '123' >>>
   print(repr(x)) # from a script you can get this behaviour by calling repr()

Where this relates to our conversation about object is that the sentence about "The default implementation [for __str__] defined by the built-in type object calls object.__repr__()." So that means if we define a __repr__ method then when we print the object we get that as well

class Test:
   def __init__(self, x):
   self.x = x
def __repr__(self):
   return "Test(x={})".format(repr(self.x))

x = Test("hi") # make a new object
print(x) # prints Test(x = 'hi')
# and the process it goes through is this chain:
   assert(str(x) # converting to a string ==
      Test.__str__(x) # is the same as calling __str__ on the class ==
      object.__str__(x) # which falls back to the method defined in superclass ==
      repr(x) # which calls repr(x)(according to those docs) ==
      Test.__repr__(x) # which calls the __repr__ method on the class

As a more concrete example we can look at str.join which is an arbitrarily selected method on a normal data type (strings) and its duality with type.mro which is a method on type objects in the same way:

>>> x = "hello"
>>> str.join # unbound method of strings
<method 'join' of 'str' objects>
   >>> x.join #bound method of x
   <built-in method join of str object at 0x109bf23b0>
      >>> hex(id(x)) # the memory address of x as seen above

      >>> type.mro #unbound method
      <method 'mro' of 'type' objects>
         >>> int.mro #mro method bound to int
         <built-in method mro of type object at 0x106afeca0>
            >>> hex(id(int)) # address of int object as seen above
            >>> int.mro() #mro stands for Method Resolution Order, is related to __bases__
            [<class 'int'>, <class 'object'>]

Suggestion : 2

The relationship between type and object in Python , here , The relationship of objects on the whiteboard is shown in the figure below :, The inspiration for this essay comes from learning the source code type And object Relationship confusion , This paper is mainly referred to : ..., We'll use a whiteboard to describe Python The relationship between the objects inside , The whiteboard is divided into three columns :

 The two are examples of each other, But it 's not a subclass relationship , Only type yes object Subclasses of , The opposite is not true .
 Daniel said that the two are the relationship between laying hens and laying hens, But I still don 't understand , Please explain if you understand ,
 Hope not to give links in foreign languages.python Why design two, Can you get rid of one?

Suggestion : 3

Every object in Python is classified as immutable (unchangeable) or not. In terms of the core types, numbers, strings, and tuples are immutable; lists and dictionaries are not (they can be changed in-place freely). Among other things, immutability can be used to guarantee that an object remains constant throughout your program.,An “immutable” object is an object that cannot be changed after it is created. Numbers, strings, and tuples in Python fall into this category. While you cannot change an immutable object in-place, you can always make a new one by running an expression.,Numbers, strings, lists, dictionaries, tuples, and files are generally considered to be the core object (data) types. Sets, types, None, and Booleans are sometimes classified this way as well. There are multiple number types (integer, long, floating point, and decimal) and two string types (normal and Unicode).,What does “immutable” mean, and which three of Python’s core types are considered immutable?

123 + 222 # Integer addition
   1.5 * 4 # Floating - point multiplication
   2 ** 100 # 2 to the power 100
1267650600228229401496703205376 L
S = 'Spam' >>>
   len(S) # Length
   S[0] # The first item in S, indexing by zero - based position 'S' >>>
   S[1] # The second item from the left 'p'
   'Spam' >>>
   S[0] = 'z'
# Immutable objects cannot be changed...error text omitted...
   TypeError: 'str'
object does not support item assignment

   S = 'z' + S[1: ] # But we can run expressions to make new objects >>>
   S 'zpam'
S.find('pa') # Find the offset of a substring
   S 'Spam' >>>
   S.replace('pa', 'XYZ') # Replace occurrences of a substring with another 'SXYZm' >>>
   S 'Spam'
dir(S)['_  _add_  _', '_  _class_  _', '_  _contains_  _', '_  _delattr_  _', '_  _doc_  _',
   '_  _eq_  _',
   '_  _ge_  _', '_  _getattribute_  _', '_  _getitem_  _', '_  _getnewargs_  _',
   '_  _getslice_  _',
   '_  _gt_  _', '_  _hash_  _', '_  _init_  _', '_  _le_  _', '_  _len_  _', '_  _lt_
   _ ', '
   _ _mod_ _ ',
   '_  _mul_  _', '_  _ne_  _', '_  _new_  _', '_  _reduce_  _', '_  _reduce_ex_
   _ ', '
   _ _repr_ _ ',
   '_  _rmod_  _', '_  _rmul_  _', '_  _setattr_  _', '_  _str_  _',
   'capitalize', 'center',
   'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index',
   'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper',
   'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex',
   'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',
   'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

Suggestion : 4

Last Updated : 25 Jul, 2022

Syntax of type() function

type(name, bases, dict)


class 'int'
class 'str'
class 'list'

Suggestion : 5

An object is simply a collection of data (variables) and methods (functions) that act on those data. Similarly, a class is a blueprint for that object.,It can also be used to create new object instances (instantiation) of that class. The procedure to create an object is similar to a function call.,Of one particular interest is the __init__() function. This special function gets called whenever a new object of that class is instantiated.,In this tutorial, you will learn about the core functionality of Python objects and classes. You'll learn what a class is, how to create it and use it in your program.

Here is a simple class definition.

class MyNewClass:
'This is a docstring. I have created a new class'

As soon as we define a class, a new class object is created with the same name. This class object allows us to access the different attributes as well as to instantiate new objects of that class.

class Person:
"This is a person class"
age = 10

def greet(self):

# Output: 10

# Output: <function Person.greet>

   # Output: "This is a person class"


<function Person.greet at 0x7fc78c6e8160>
   This is a person class

This means to say, since Person.greet is a function object (attribute of class), Person.greet will be a method object.

class Person:
"This is a person class"
age = 10

def greet(self):

# create a new object of Person class
harry = Person()

# Output: <function Person.greet>

   # Output: <bound method Person.greet of <__main__.Person object>>

      # Calling object's greet() method
      # Output: Hello

This type of function is also called constructors in Object Oriented Programming (OOP). We normally use it to initialize all the variables.

class ComplexNumber:
   def __init__(self, r = 0, i = 0):
   self.real = r
self.imag = i

def get_data(self):
   print(f '{self.real}+{self.imag}j')

# Create a new ComplexNumber object
num1 = ComplexNumber(2, 3)

# Call get_data() method
# Output: 2 + 3 j

# Create another ComplexNumber object
# and create a new attribute 'attr'
num2 = ComplexNumber(5)
num2.attr = 10

# Output: (5, 0, 10)
print((num2.real, num2.imag, num2.attr))

# but c1 object doesn 't have attribute '
attr '
# AttributeError: 'ComplexNumber'
object has no attribute 'attr'

Suggestion : 6

You will see the term “object” be used frequently throughout this text. In Python, the term “object” is quite the catch-all; including numbers, strings of characters, lists, functions - a Python object is essentially anything that you can assign to a variable. That being said, there are different types of objects: Python treats integers as a different type of object than a string, for instance.,The term “object” is a catch-all in Python, meaning anything that we can assign to a variable. Objects behave differently from one another according to what “type” a given object is.,We will encounter other types of containers in Python, what makes the list stand out is that the contents of a list can be changed after the list has already been constructed. Thus a list is an example of a mutable object.,You can also include variables, equations, and other Python expressions in the list constructor; Python will simplify these expressions and construct the list with the resulting objects.

# assign the variable `x`
to the integer 1
   x = 1

# checking the type of `x` >>>

# verifying that `x`
is an integer - type object >>>
   isinstance(x, int)
# multiplication takes precedence over addition
   1 + 2 * 3

# grouping operations with parentheses
   (1 + 2) * 3

# finding the remainder of division between two positive numbers >>>
   11 % 5

# checking an inequality
   (2 ** 3) < (2 ** 4)
# In many other languages, 3 / 2 returns the integer 1.
# In Python 3, division always returns a floating - point number:
   3 / 2

   4 / 2
# floor - division >>>
   1 // 3  # 0.3333.. -> 0
   3 // 2  # 1.5 -> 1
# using the `math`
module to use
# additional mathematical functions
   import math >>>

# base - 10 log >>>

# 4! = 4 * 3 * 2 * 1 >>>
>>> type(-3)

# `1.3`
is not an integer - type object >>>
   isinstance(1.3, int)

# converting a string to an integer

# converting a floating - point number to an integer >>>