python面向对象基本概念_Python基础系列讲解——面向对象体系的概念剖析

关于Python的面向对象概念的介绍,网上已经多到了铺天盖地的程度,但是真正很系统化、结构化地把这个内容归纳清晰的却不多,那么偶然的机会看到了一幅关于描述Python面向对象机制的拓扑图,结合这幅图正好可以来说下Python面向对象的体系。

在拓扑图中从左至右的框图分别代表了元类、类/类型、实例,描述了面向对象体系中主要存在的两种关系:实线描述的“父类”和“子类”关系;虚线描述的“类”和“实例”关系。“父类”和“子类”关系指的是子类继承父类的特征,同时“子类”还可以拥有自己的特征。“类”和“实例”关系指的是“实例”对象是“类”对象的具体实现。比如蛇是一种爬行动物,其中蛇是子类,爬行动物是父类,蛇拥有爬行动物的特征,同时又拥有标志自己是一条蛇的特征。这个机制的好处是可以在不改变超类代码的基础上改变原有的功能。产生了所需的类后,我们可以通过类来创建实例,比如我有一条宠物蛇叫Squasher,那么Squasher就是蛇的一个实例。

以内置类型list为例,我们发现list的类型是,list的“父类”或“超类”是(,),对于list的一个实例mylist,它的类型是,由于“抽象类”只能被继承,不能被实例化,所以mylist并不存在“父类”或“超类”。同理,对于内置类型tuple、dict或int也是一样。

print list.__class__ ——>>

print list.__bases__ ——>> (,)

mylist = [1,2,3]

print mylist.__class__ ——>>

print mylist.__bases__ ——>> AttributeError: 'list' object has no attribute '__bases__'

除了Python内置类型外,我们可以通过class语句继承一个已存在的类/类型而新建一个新的类/类型,比如class C(object)继承了“父类”或“超类”object,这里要说明下的是Python 2.7 版本中C的类型为经典类classobj,如果C显式继承了超类’object’就成为了新式类,Python 3.x中所有的类都是新式类,即显示或隐式继承自object。

class C():pass

print(type(C)) ——>>

class C(object):pass

print(type(C)) ——>>

当我们需要创造一个全新的类时可以使用元类来实现,我们知道对象由类实例化得到的,而类也是对象,它也是由类实例化得到,元类的角色即为创建类的类,也就是通过实例化得到新的类,Python中只有type类及其子类才可以当元类。

那么我们结合例子再来说下图中’object’和’type’之间的关系。我们可以发现object是type的实例(用虚线连接),type本身也是自己的实例,同时object自己已经是所有对象的超类,包括也是type的超类(用实线连接),因此object并没有超类。总体而言object和type是Python中的两个源对象,它们互相依赖对方来定义,网上有人说鸡生蛋和蛋生鸡的关系倒也挺贴切的。

type(object) ——>>

object.__class__ ——>>

object.__bases__ ——>> ()

type.__class__ ——>>

type.__bases__ ——>> (,)

类型框图中内置类型list与元类框图中type之间的虚线箭头连接又是怎么回事呢?根据“虚线向下规则”(Dashed Arrow Down Rule,If B is an instance of M, and A is a subclass of B, then A is an instance of M as well.),由于object是type的实例,同时list、tuple、dict是object的子类,那么list、tuple、dict也是type的实例(虚线所示)。另外一个“虚线向上规则”(Dashed Arrow Up Rule:If X is an instance of A, and A is a subclass of B, then X is an instance of B as well.)指的是mylist是list的实例,同时list又是object的子类,那么mylist也是object的实例。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页