栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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(type(testval)) ——>>  
type(testval).__bases__  ——>>  (,)
dir(testval)   ——>>  ['__abs__', '__add__',......'real']

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

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

另外看到官方文档中公布了一则消息,在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)) ——>>  
print(type(B)) ——>>  

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

(type(A)).__bases__  ——>>  (,)
(type(B)).__bases__  ——>>  (,)

在类的基础上我们可以继承(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__ ——>> (, )

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

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

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

ef.__class__  ——>>  

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/222061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号