zoukankan      html  css  js  c++  java
  • python中对象、类型和元类之间的关系

    在python中对象、类型和元类构成了一个微妙的世界。

    他们有在这个世界里和平共处,相辅相成。它们遵循着几条亘古不变的定律:

    1、python中无处不对象

    2、所有对象都有三种特性:id、类型、值

    3、每个对象都是由其对应的类创建出来的

    下面来逐条进行分析:

    1、python中无处不对象

    对象是python中对数据的一种抽象的表示。所有能够通过PyObject类型的指针访问的都是对象。

    python中的int、tuple、list、dict、set、函数、类以及派生类都是对象,当然类实例化的对象就更应该是对象了吧(这个都不知道的好,语文老师会气死的……………………)。

    2、所有对象都有三种特性:id、类型、值

    id 其实就是对象在内存中存放的地址。也就是说在内存中开辟了一块空间,用来存放对象的。id其实就相当于你在内存中的身份标识。用内置函数id()可以查询对象的id。

    id('a')
    2330255367896

    类型是生成对象的模型,相当于对象的父母。可以用type()来查看

    >>> type('a')
    <class 'str'>

    值就是对象中存放的数据。值也是对象的价值所在。所有对象存在的意义就是为了保存各种各样的值。有的对象不会改变,叫不可变对象,例如:数值、字符串、元组。对象的值可以改变的对象叫可变对象,例如:列表,集合,字典。

    3、每个对象都是由其对应的类创建出来的

    遵循第一条定律,其实模型也是对象,它是由它的父母产生的,它的父母是谁呢?查看方法是一样的。

    >>> class A(object):
    pass

    >>> a= A()
    >>> type(a)
    <class '__main__.A'>
    >>> type(A)
    <class 'type'>

    >>> A.__bases__
    (<class 'object'>,)

     这里涉及了一个区别:

    在py2.X中,新式类需要继承object类,而在py3.x中已经做了更改,在创建所有的类的时候都会默认继承object类。

    #py2.79
    
    >>> class A:
    ...     pass
    ...
    >>> A.__bases__
    ()
    >>> class B(object):
    ...     pass
    ...
    >>> B.__bases__
    (<type 'object'>,)
    >>>
    #py3.6
    >>> class A:
        pass
    
    >>> A.__bases__
    (<class 'object'>,)

    这里又出现了两个问题:

        1,object类是什么?

        2,继承是什么?

    我们先说第二个问题:

    类可以继承和派生,被继承的类叫超类,父类或者基类(管它怎么叫呢,我们只有知道,它是继承它的类的父母就可以了。。。),继承者叫子类或者派生类(叫什么无所谓,反正它是它父母的孩子,本质是不会改变的。。。PS:这里我说句题外话,某些人经常不认自己的父母或孩子,可是你们永远改变不了你们的血缘关系。)。还可以实现多继承,多继承就是一个子类继承多个父类(现在的社会很多孩子的父亲是不确定的,但是类关系确实明确的。。呵呵....又扯远了,我对这个社会是有多么深的怨念啊。)下面还是用实例说话吧。

    >>> class A:
        pass
    >>> class B:
        pass
    
    >>> class C(A):
        pass
    
    >>> class D(A,B):
        pass

    在这段代码中,C类继承A类,在这个关系中,A就是父类,C就是A的子类。D类同时继承了A类和B类,A类和B类是父类,D同时继承了A和B,所以即时A的子类又是B的子类。

    当然继承的知识还有很多,自己可以查一下相关的资料。

    再来说说第一个问题:

    object类是所有的类的祖宗。这个object其实也是一个对象(python中处处皆对象)。但是这个对象又有一些特别,其他的对象都是一个抽象的对象,而这个object却是一个具体存在的。其他的类或者对象都是通过继承的关系,直接或者间接的继承了object。翻阅所有对象的族谱,最后一定会发现它们的老祖宗就是object。

    对象和类型都说完了,剩下的就是说一说元类了。

    首先,什么是元类呢?

    list,str,int 这些类型是由谁创建的呢。对了,就是元类。元类创建的类不是一般定义的类,它创建的是模版。最根溯源,我们会找到一个特殊的元类,就是type。但是问题又来了我,我们查看type的类型的时候,发现type是由它自身创建的。

    >>> type(list)
    <class 'type'>
    >>> type(type)
    <class 'type'>
    >>> 

    难道它既是父亲,又是儿子?why?好吧,我们换种查询方式。

    >>> type.__bases__
    (<class 'object'>,)
    

    其实type是以object为模版创建的。

    是不是解释通了呢?别着急,如果你足够细心,你还会发现一个小问题。

    >>> type(object)
    <class 'type'>
    >>> 

    what?  object是由type创建的?

    其实创建它们的是一个叫虚拟机的家伙。它是来自另一个世界的。。

  • 相关阅读:
    【线程控制:线程休眠】
    【线程调度-优先级】
    【多线程实现方案一:继承Thread 类】
    【多线程概述】
    【使用Mybatis-Generator自动生成Mapper、Model、Mapping相关文件】
    【springmvc集成mybatis框架】
    【UltraISO制作centos7系统安装盘】
    【己有原码, 为何还有反码和补码?】
    【原码, 反码, 补码的基础概念和计算方法】
    【数据类型】
  • 原文地址:https://www.cnblogs.com/zuoshoushizi/p/7600145.html
Copyright © 2011-2022 走看看