为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
Python

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

图片描述

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

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

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

mylist = [1,2,3]
print mylist.__class__ ——>>  <type 'list'>
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)) ——>>  <type 'classobj'>

class C(object):pass
print(type(C)) ——>>  <type 'type'>

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

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

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

类型框图中内置类型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的实例。

点击查看更多内容
4人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消