我们都知道python是面向对象的高级编程语言,在学习Python的过程中也经常听到在python中一切皆对象这种说法。一切皆对象,这句话到底该怎么理解呢?
要充分理解这句话,首先要理解对象(object)、和类(class)的概念,以及对象和类的关系。
1. 实例化
类和对象在编程世界里的意义其实是从现实世界中引申出来的。首先第一点,类是一个抽象的概念,不是一个具体的事物。它(类)只存在于我们的思维世界里。为什么我们要发明“类”这个概念,要从我们人类认识世界,改造世界的行为说起。
我们把自然界的万物分门别类,分为动物、植物微生物等。而动物又可以进一步分为爬行动物、哺乳动物等。但自然界中并不存在什么爬行动物、哺乳动物,这些只是概念,是我们为了更加深入了解这个世界而发明的。自然界里真实存在的只是小明家阳台上那只喜欢吃肉的乌龟和楼下小王那只调皮的大金毛。
人类对万事万物进行分门别类的来认识和理解,根本上是为了更好的归纳知识和理解这个世界,或者说是大脑还够发达,只能用这种折中的方案来高效的处理自己和自然界的关系。而且人类的这种行为处处存在,影响着我们的每一个举动。我们把衣橱划分为几个区域分别存放冬天的衣物和夏天的衣物而不是混在一起;图书馆里的书籍也是按照分成文学、历史、自然科学等门类分放于不同的区域;甚至大到一个城市分为居住区和工业区。之所以有分类的概念,是因为随着人类认识世界的深入,产生的知识总量越来越大,大到一个人的脑袋再也无法知全貌而只能做一些简化了。最好的简化方法就是归纳提炼在抽象,于是就产生类的概念。
在回到编程语言,面向对象这个编程语言之所以在当今更加流行,是因为它更好的符合了我们的直觉,更加符合我们如今处理这个直接的思维方式。
从现实世界中的类和具体事物的关系来类比python中的class(类)和object(对象)的关系: 即python中我们实际处理的,比如说命名,赋值,参与各种运算的都是实例,也就是各种对象object,它对应现实世界中各个活生生的人或者动物实例。而这些实例不能无缘无故产生,它们是由一个“工厂”造出来的,这个工厂就是类。类造出对象这个过程就是一个对象通过类实例化的过程,一个从抽象到具体的过程。
下面通过实例来演示。
我们知道python中可以通过type函数查看一个对象的类型,即属于哪个类,另外一层意思就是该对象由哪个类实例化而来。
a, b = 7, 8
c,d = 'hello', 'python'
type(a), type(c)
>>>
(int, str)
# 查看int类和str类的类型
type(int), type(str)
>>>
(type, type)
# 查看type类的类型
type(type)
>>>
type
print('a+b = {}'.format(a+b))
print('c+d = {}'.format(c+d))
>>>
a+b = 15
c+d = hellopython
通过上面的type查看类的实例化链条可以发现:
- 所有python中的内置的类如int、str、list等都是由type类实例化出来的对象,而我们经常用到的具体的实例如7,8,”python“字符串等都是相应的类实例化得来。万物皆对象在这里包含三层意思:
- 具体的实例对象由相应的类创造(实例化)
- 类也是对象,它是由type类实例化而来
- 甚至type类也是对象,但是它比较特殊,它是由它本身实例化而来, 这样type就是所有类最顶层的类。这样的设计避免无限循环。
简写成链条形式:type --> class --> object, 或者对应成type --> int --> 3
再思考: 这种由类实例化对象设计模式有什么好处呢?
好处是显而易见的,为什么上面的 “7+8 =15”而不是“78”, 为什么“hello” + ’python“的结果是”hello python“而不是对应的acll码相加呢?
因为类是封装对象是属性和行为的载体,也就是说int和str类有哪些行为和属性已经封装在int和str类的定义中了,从而规定了通过int和str类实例化的对象具有哪些行为
由上总结出对象和类的关系:类是对象的抽象,对象是类是实例。在类中,对象的行为是以方法的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和方法。
实例化是类和对象的第一层关系
2. 父类子类的继承关系
继承是面向对象编程语言的另一个特性。所谓的继承是指子类可以继承父类的属性和方法。在python中可以通过.base来查看一个类的父类
class Car:
pass
class Suv(Car):
pass
audi = Car()
jeep = Suv()
上面的代码中我们先创造了一个类Car, 之后用Car创造了一个子类Suv, 之后分别由这两个类实例出一个对象audi和jeep。我们先查看之前说的实例化链条:
print('check the object is instance from which class')
print(type(audi))
print(type(jeep))
print("-" *10)
print('check the class is instance from which class')
print(type(Car))
print(type(Suv))
>>>
check the object is instance from which class
<class '__main__.Car'>
<class '__main__.Suv'>
----------
check the class is instance from which class
<class 'type'>
<class 'type'>
和我们之前说的一致: type -->Car/Suv --> audi/jeep
在查看他们的继承关系:
# 每个类都可以通过.__base__()方法查看基类
print(int.__base__)
print(Suv.__base__)
print(Car.__base__)
print(object.__base__)
print(type.__base__)
>>>
<class 'object'>
<class '__main__.Car'>
<class 'object'>
None
<class 'object'>
即:
- 所有内置的类(int/str...)的父类(或者叫基类)都是object
- python中自定义的类如果指明继承关系,自动继承object父类
- 作为所有类的最后的基类——object类, 它的父类是空(None)
- 既然object是最终的父类,那么毫无疑问,type类的父类也是object
所以:
- 类object是类中父子继承关系的顶端,所有的类的最终父类都是它;
- type是类型实例关系的顶端,所有对象都是它的实例的。
object和type'它们两个的关系可以这样描述: - object is and instance of type,即Object是type的一个实例。
- type is kind of object,即Type是object的子类。
最后用下面这张图表达全景:
image.pngtype:
网友评论