手记

Python基础系列讲解——类和类型的概念剖析

Python是一门面向对象的语言,在Python中一切皆为对象(object)。对象是什么?对象总体来说是对某个实体的抽象描述,对象可分为类型和非类型两种(或者类和非类两种),类型是指可被继承和实例化的对象,比如int是可被继承和实例化,而非类型是指一个实例对象,比如一个数值为100的对象,它并没有被继承的意义。所谓的类是我们从一堆对象中抽取相同的特征内容构造而成的,也就是我们所称的抽象的概念,特征内容即为类的全部属性。比如有香蕉类、苹果类、桃子类,从这些类抽取相同的特征内容就是水果这个抽象类。那么类型和类又有什么关系呢?

这里有必要说下Python经典类classic classes和新式类new-style classes的区别,classic classes的元类是types.ClassType,而new-style classes的元类是type,也就是说所有的新式类都是由type类实例化创建而来。在Python 2.x及以前的版本中我们由class代码块创建的类对象是经典类,内建类型都属于新式类。

我们先来研究下类型。比如我们创建testval这个实例对象,type()获得testval的类型是int,近一步分析可知int的类型为’type’,int的超类(父类)是’object’,同时也看到int包含了对象所具有的全部属性。

testval = 100 
type(testval) ——>> <type 'int'>
type(type(testval)) ——>>  <type 'type'>
type(testval).__bases__  ——>>  (<type 'object'>,)
dir(testval)   ——>>  ['__abs__', '__add__',......'real']

'object’和’type’之间的关系是什么?再近一步分析可知object是type的实例,type本身也是自己的实例,同时object自己已经是所有对象的超类,包括也是type的超类,因此object并没有超类。总体而言object和type是Python中的两个源对象,它们互相依赖对方来定义,因此所有直接或间接继承object的类属于新式类。

type(object) ——>> <type 'type'> 
object.__class__  ——>> <type 'type'>
object.__bases__  ——>> ()
type.__class__ ——>>  <type 'type'>
type.__bases__ ——>>  (<type 'object'>,)

另外看到官方文档中公布了一则消息,在Python 2.7版本中已经集成了新式类,而经典类在Python 3.x中被移除,也就是说在Python3.x及之后的版本,类和类型已经合并为一体。

在Python 2.7 版本中运行以上代码可知A的类型为老式的classobj,B显式继承了超类’object’成为了新式类,Python 3.x的运行结果与B完全相同,进一步印证在Python 3.x中所有的类都是新式类,即显示或隐式继承自object类。

class A():pass
class B(object):pass
print(type(A)) ——>>  <type 'classobj'>
print(type(B)) ——>>  <type 'type'>

再近一步分析可知class类型的超类也是’object’,可以说所有类都直接或间接的继承自’object’。

(type(A)).__bases__  ——>>  (<type 'object'>,)
(type(B)).__bases__  ——>>  (<type 'object'>,)

在类的基础上我们可以继承(inheritance)超类的属性,并在超类的基础上派生(derived)新的属性创建出新类,两者之间的关系为父类和子类的关系,比如蛇是一种爬行动物,其中蛇是子类,爬行动物是父类,蛇拥有爬行动物的特征,同时又拥有标志自己是一条蛇的特征。这个机制的好处是可以在不改变超类代码的基础上改变原有的功能。产生了所需的类后,我们可以通过类来创建实例,那么类和实例关系可体现在两个对象之中,其中一个对象(实例)是另一个对象(类型)的具体实现。比如我有一条宠物蛇叫Squasher,那么Squasher就是蛇的一个实例。

class C(object):   
    pass

class D(object):
    pass
    
class E(C, D):    
pass    

我们可以使用內建的函数issubclass查看一个类是否是另一个类的子类

issubclass(E,C) ——>> True  

也可以使用bases查看一个类包含哪些子类

E.__bases__ ——>> (<class '__main__.C'>, <class '__main__.D'>)

同样可以检查一个对象是否是一个类的实例

ef= E()
isinstance(ef,E) ——>> True  

以及查看一个对象属于哪个类

ef.__class__  ——>>  <class '__main__.E'>


3人推荐
随时随地看视频
慕课网APP