一张图解释清楚何为“python一切皆为对象”
在清楚了python中类、对象、实例等之间的关系后,下面的图结合后面的代码示例,可以让你更好的理解“一切皆为对象”到底是怎么一回事。
总结一下几个点:
- python中的所有的数据类型,int、float、str、list、dict、tuple等等,本身即为类,在声明变量的时候,实际是各个“数据类型”类的实例化。
- 各个数据类型的类,又均是type类的实例对象
- 自定义的方法和类同样也是如此,方法的创建即为function类的实例化;类的创建也可以说是由type类所完成的(实际要复杂很多,设计到元类等知识)
- python中所有类的最终父类都是object类,包括type类
- python中所有实例的最终类对象均是type类,包括object类,所以object类也是type类的实例对象,但是type类继承自object,相当于type类也是自己的实例对象。
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 19 10:49:11 2020
author: Irvinfaith
email: Irvinfaith@hotmail.com
"""
###### int
a = 1
print('a的类对象:', a.__class__)
print('a的父类:', a.__bases__)
print('因为a是实例对象,所以不存在继承关系')
print('int的类对象:', int.__class__)
print('int的父类:', int.__bases__)
'''
Output :
a的类对象: <class 'int'>
AttributeError: 'int' object has no attribute '__bases__'
因为a是实例对象,所以不存在继承关系
int的类对象: <class 'type'>
int的父类: (<class 'object'>,)
'''
###### str
b = 'a string'
print('b的类对象:', b.__class__)
print('b的父类:', b.__bases__)
print('因为b是实例对象,所以不存在继承关系')
print('str的类对象:', str.__class__)
print('str的父类:', str.__bases__)
'''
Output :
b的类对象: <class 'str'>
AttributeError: 'str' object has no attribute '__bases__'
因为b是实例对象,所以不存在继承关系
str的类对象: <class 'type'>
str的父类: (<class 'object'>,)
'''
###### list
c = [1, 2, 3]
print('c的类对象:', c.__class__)
print('c的父类:', c.__bases__)
print('因为c是实例对象,所以不存在继承关系')
print('list的类对象:', list.__class__)
print('list的父类:', list.__bases__)
'''
Output :
c的类对象: <class 'list'>
AttributeError: 'list' object has no attribute '__bases__'
因为c是实例对象,所以不存在继承关系
list的类对象: <class 'type'>
list的父类: (<class 'object'>,)
'''
###### function
def my_func():
pass
print('my_func的类对象:', my_func.__class__)
print('my_func的父类:', my_func.__bases__)
print('因为my_func是实例对象,所以不存在继承关系')
print('function的类对象:', my_func.__class__.__class__)
print('function的父类:', my_func.__class__.__bases__)
'''
Output :
my_func的类对象: <class 'function'>
AttributeError: 'function' object has no attribute '__bases__'
因为my_func是实例对象,所以不存在继承关系
function的类对象: <class 'type'>
function的父类: (<class 'object'>,)
'''
###### class
'''
在python3中,创建类的时候,默认都是继承的object,所以在python3中也可以省略不写
即:
class MyClass:
pass
和下面的创建效果是一致的
'''
class MyClass(object):
pass
mc = MyClass()
print('myclass的类对象:', mc.__class__)
print('myclass的父类:', mc.__bases__)
print('因为myclass是实例对象,所以不存在继承关系')
print('Myclass的类对象:', MyClass.__class__)
print('Myclass的父类:', MyClass.__bases__)
'''
Output :
myclass的类对象: <class '__main__.MyClass'>
AttributeError: 'MyClass' object has no attribute '__bases__'
因为myclass是实例对象,所以不存在继承关系
Myclass的类对象: <class 'type'>
Myclass的父类: (<class 'object'>,)
'''