Python教程3 - 复习:内置对象
这篇文章是对我们之前所学知识的复习,也教授了一些新的知识,并且提供了一些习题来巩固大家所学的知识。由于我们已经大致掌握了Python命令式编程的设施,这里我就把很多细节补全,并且不再是按照人的学习顺序组织。这篇文章的内容适合不仅适合那些Python新手,也适合已经熟练运用Python的人巩固知识或作为参考查询。
内置对象
我们可能经常会用到对象这个词。按照Python的官网上的说法,所谓对象就是一个有唯一ID、值和类型的东西。对象的ID和类型是不会改变的,而根据对象的值能否改变,对象可以分为可变的(mutable) 和 不可变的(immutable),这是由它的类型决定的。有些容器如元组,虽然它的内容可能是个可变对象,但我们依旧认为它是个不可变对象。Python中的一切实体都是对象,或者说一切可被赋值给变量的都是对象。而变量是一种到对象的引用,它将一个对象绑定到了名字。当没有任何方法能够获取到某个对象时,那个对象就会被销毁。
Python的类型之间是有父子关系的。子类型会拥有父类型的所有方法。所有的类型都是object类型的子类型。比如int类型就是object类型的子类型,这种父子关系我们称为继承(inheritance),因此我们说int类型继承自object类型。这里我们还需要引入一个名词叫实例(instance),当我们说对象a是类型A的实例的时候,其实就在说对象a的类型是A或者A的子类型(包括直接或间接的)。比如1是int的实例,'1'是str的实例,而1和'1'都是object的实例,甚至Python中一切的对象都是object的实例。
面向对象编程启发自大自然。我们就以大自然中的动物为例,每个动物都有一些属性,比如性别,同时它们也有一些方法,比如繁殖。将这些属性和方法聚集在一起,这就是面向对象的第一个组成部分——封装(encapsulation)。而人类和鸟类都继承自动物,因此人类和鸟类都有繁殖这个方法,同时又有性别这个属性,这就是继承(inheritance),面向对象编程的第二个重要组成部分。另一方面,子类型除了能继承父类型的所有方法之外,还能重新定义父类型的方法。比如人类的繁殖是胎生,而鸟类的繁殖就是卵生。这样同样是动物,却对同一个方法有不同的具体行为,这就是多态(polymorphism)。多态是面向对象编程的第三个重要组成部分。
最后,我和正在阅读这些文字的你都是人类和动物的实例(instance),是一种对象(object)。
下图是一些内置类型的继承关系,其中方框是内置类型,椭圆来自collection.abc,每个椭圆的内容都提供一些方法。以后如果有机会,我会再来介绍每个节点是什么含义,你可以点击此处查看相关文档。
接下来介绍下面2个运算符和4个函数:
id(a)函数:获取对象的ID,这个ID是个整数,而且在对象存在的期间是唯一的(不与其他对象一样);type(a)函数:获取对象的类型;a is b和a is not b:判断a和b是不是同一对象,如果id(a) == id(b),则就认为是同一对象;isinstance(a, A):判断对象a是否是类型A的实例,注意这个运算符与type(a) is A还是有区别的比如isinstance(1, object)是真,但是type(1)是int不是object。issubclass(A, B):判断类型A是否是类型B的子类型。
下面是例子。
>>> id(1)  # 这个数字是会改变的
139698536331168
>>> type(1) is int  # 最好不要在此处使用 ==
True...剩余内容已隐藏
Python教程3 - 复习:内置对象
这篇文章是对我们之前所学知识的复习,也教授了一些新的知识,并且提供了一些习题来巩固大家所学的知识。由于我们已经大致掌握了Python命令式编程的设施,这里我就把很多细节补全,并且不再是按照人的学习顺序组织。这篇文章的内容适合不仅适合那些Python新手,也适合已经熟练运用Python的人巩固知识或作为参考查询。
内置对象
我们可能经常会用到对象这个词。按照Python的官网上的说法,所谓对象就是一个有唯一ID、值和类型的东西。对象的ID和类型是不会改变的,而根据对象的值能否改变,对象可以分为可变的(mutable) 和 不可变的(immutable),这是由它的类型决定的。有些容器如元组,虽然它的内容可能是个可变对象,但我们依旧认为它是个不可变对象。Python中的一切实体都是对象,或者说一切可被赋值给变量的都是对象。而变量是一种到对象的引用,它将一个对象绑定到了名字。当没有任何方法能够获取到某个对象时,那个对象就会被销毁。
Python的类型之间是有父子关系的。子类型会拥有父类型的所有方法。所有的类型都是object类型的子类型。比如int类型就是object类型的子类型,这种父子关系我们称为继承(inheritance),因此我们说int类型继承自object类型。这里我们还需要引入一个名词叫实例(instance),当我们说对象a是类型A的实例的时候,其实就在说对象a的类型是A或者A的子类型(包括直接或间接的)。比如1是int的实例,'1'是str的实例,而1和'1'都是object的实例,甚至Python中一切的对象都是object的实例。
面向对象编程启发自大自然。我们就以大自然中的动物为例,每个动物都有一些属性,比如性别,同时它们也有一些方法,比如繁殖。将这些属性和方法聚集在一起,这就是面向对象的第一个组成部分——封装(encapsulation)。而人类和鸟类都继承自动物,因此人类和鸟类都有繁殖这个方法,同时又有性别这个属性,这就是继承(inheritance),面向对象编程的第二个重要组成部分。另一方面,子类型除了能继承父类型的所有方法之外,还能重新定义父类型的方法。比如人类的繁殖是胎生,而鸟类的繁殖就是卵生。这样同样是动物,却对同一个方法有不同的具体行为,这就是多态(polymorphism)。多态是面向对象编程的第三个重要组成部分。
最后,我和正在阅读这些文字的你都是人类和动物的实例(instance),是一种对象(object)。
下图是一些内置类型的继承关系,其中方框是内置类型,椭圆来自collection.abc,每个椭圆的内容都提供一些方法。以后如果有机会,我会再来介绍每个节点是什么含义,你可以点击此处查看相关文档。
接下来介绍下面2个运算符和4个函数:
id(a)函数:获取对象的ID,这个ID是个整数,而且在对象存在的期间是唯一的(不与其他对象一样);type(a)函数:获取对象的类型;a is b和a is not b:判断a和b是不是同一对象,如果id(a) == id(b),则就认为是同一对象;isinstance(a, A):判断对象a是否是类型A的实例,注意这个运算符与type(a) is A还是有区别的比如isinstance(1, object)是真,但是type(1)是int不是object。issubclass(A, B):判断类型A是否是类型B的子类型。
下面是例子。
>>> id(1)  # 这个数字是会改变的
139698536331168
>>> type(1) is int  # 最好不要在此处使用 ==
True...剩余内容已隐藏