美文网首页
Python的进阶之路:所谓的类不过如此

Python的进阶之路:所谓的类不过如此

作者: EchoPython | 来源:发表于2019-07-05 15:14 被阅读0次

    类的描述

    我们习惯于将生物分为动物,植物,进而又有猫科,犬科等细分.通过对个体的研究,归纳其共同特征,抽象成了描述种类模板,有了这些模板后,可据此创建大量行为类似的个体,所以分类是一个基础工程

    在专业术语上,我们将族群或类别乘坐 类型(class) 将个体称之为实例(instance). 类型持有同组个体的共同形态和共享状态,而实例仅仅保存只有特性即可.如此在内存空间布局上才是最高效的.

    以张三,李四为例. 在创建抽象模型时,人类的共同特征,诸如:吃饭,走路等,统统放在"人类"这个类型里面,个体只是保存姓名,性别,胖瘦,肤色这些即可.如下图所示

    Python的进阶之路:所谓的类不过如此

    存活的实例对象都有"唯一"的ID值

    In [1]: id(123) 
    
    Out[1]: 10914304
    
    In [2]: id('123') 
    
    Out[2]: 140705948508032
    

    不同的Python实现使用不同算法,Cpython用内存地址作为ID值,这意味着它只能保证在某个时间,在存活对象里面是唯一的,他不能保证整个生命周期内的唯一性,因为内存地址会被复用,因此ID不适合作为全局身份标识.

    可以用type返回实例所属的类型.

    In [6]: type(1) 
    
    Out[6]: int
    
    In [7]: type(1.2) 
    
    Out[7]: float
    
    In [8]: type("hello") 
    
    Out[8]: str
    

    要判断实例是否属于特定类型,可以使用isinstance 函数

    In [9]: isinstance(1,int) 
    
    Out[9]: True
    
    In [10]: isinstance(1,float) 
    
    Out[10]: False
    

    类型之间的继承关系

    类型之间可构成继承关系,就想老虎继承自猫科,而猫科又继承与哺乳动物,网上还有更顶层的类型.继承关系让类型拥有其所有祖先的特性.因为历史原因,Python允许多继承,可就是说可以有多个父类,好像是人类同时拥有父族,母族遗传特征.详细如图所示

    Python的进阶之路:所谓的类不过如此

    继承关系

    任何类型都有其祖先类型的子类,同样,对象也可以判定为其祖先类型的实例,(涉及到面向对象中的多态有关.后面再做详细概述)

    事实上,所有类型都有个共同的祖先类 Object,他为所有类型提供原始模板,以及系统所需要的基本操作方式.

    In [11]: isinstance(int,object) 
    
    Out[11]: True
    

    类型虽然是抽象族群概念,但是在实现上也只是一个普通的对象实例.区别在于,所有的类型都是type创建的,这与继承无关

    In [12]: id(int) 
    
    Out[12]: 10283392
    
    In [13]: type(int) 
    
    Out[13]: type
    
    In [14]: isinstance(int,type) 
    
    Out[14]: True
    
    

    怎么理解呢?单单从类型对象而言,其本质就是用来储存方式和字段成员的特殊容易,用同一份设计来实现才是正常思路

    这就好比扑克牌,就单单从玩法逻辑上看,JQKA等都有不同含义,但是从材质上面看,他们完全相同,没道理用不同的材料去制作这些内容不同的卡片.同理继承也只是说明两个类型在逻辑上存在关联关系,如此,所有类型对象都属于 type 实例就很好理解了.

    无论是编码,还是设计,都要有正确区分逻辑与实现的差异

    >In [15]: type(int) 
    
    Out[15]: type
    
    In [16]: type(str) 
    
    Out[16]: type
    
    In [17]: type(type) 
    
    Out[17]: type
    

    当然,类型对象属于创建者这样的特殊存在,默认情况下,他们由解释器首次载入时自动生成,生命周期与进程相同,且仅有一个实例.

    In [18]: type(100) is type(1234) is int # 指向同一类对象
    
    Out[18]: True
    
    

    相关文章

      网友评论

          本文标题:Python的进阶之路:所谓的类不过如此

          本文链接:https://www.haomeiwen.com/subject/ahlehctx.html