• Python 中的type和object详解


    1、python中的类

     Python2.x 中的类分为两种,一种是所有继承自object的新式类,另外一种是经典类classobj,

      新式类的写法:

      class A(object):
        pass 

      经典类的写法:

      class A():
        pass 

      这两种类在除了在多继承的时候,继承查找顺序算法不一致外,并没有其他区别,这里就不再详细说明。当然在python3中已经不存在经典类。

     2、类的继承关系  

      所有的新式类继承自object

      所有的经典类继承自 空

      每一个(注意这里是类)都有一个__bases__属性,表示这个类的基类,我们可以用 CLASS.__base__查看一下常用的类:

    print bool.__bases__
    print int.__bases__
    print float.__bases__
    print set.__bases__
    print list.__bases__
    print dict.__bases__
    print tuple.__bases__
    print str.__bases__
    print basestring.__bases__
    print A.__bases__

      输出结果:

    (<type 'int'>,)
    (<type 'object'>,)
    (<type 'object'>,)
    (<type 'object'>,)
    (<type 'object'>,)
    (<type 'object'>,)
    (<type 'object'>,)
    (<type 'basestring'>,)
    (<type 'object'>,)
    (<type 'object'>,)

      可以看到,常用类都是继承自object的,也就是说我们常用的都是新式类。object的基类和经典类的基类又是什么?

    class B():
      pass
    
    print B.__bases__
    print object.__bases__

      输出结果:

    ()
    ()

      由此可见,新式类和经典类是类继承关系链中的顶层。

    3、对象的__class__属性

      对于任何一个对象,都可以用__class__属性查看对象所属的类

    print (33).__class__
    print (33.3).__class__
    print (True).__class__
    print (['1', '2']).__class__
    print ((['1', '2'])).__class__
    print ({'a': 'b'}).__class__
    print ((3,)).__class__
    print ('str').__class__

      输出结果:

    <type 'int'>
    <type 'float'>
    <type 'bool'>
    <type 'list'>
    <type 'list'>
    <type 'dict'>
    <type 'tuple'>
    <type 'str'>

      小结:到此我们已经把类的继承关系弄清楚了。

       1、Python2.x 有两种类,经典类和新式类

       2、查看类的基类用__bases__

       3、查看对象的所属类用__class__

    4、Python中的type

      在讲解type之前,先来看一组例子:

    a = A()
    print type(33)
    print type(33.3)
    print type(a)
    
    print type(int)
    print type(float)
    print type(A)
    print type(object)
    
    print type(B)

      输出结果:

    <type 'int'>
    <type 'float'>
    <class '__main__.A'>
    <type 'type'>
    <type 'type'>
    <type 'type'>
    <type 'type'>
    <type 'classobj'>

      1、首先看前三个,对三个实例对象调用type()方法,输出结果为三个对象的类。

      2、接下来四个,对类型调用type()方法,输出结果均为<type ‘type’>

      3、最后一个经典类,输出是<type ‘classobj’>

      这里最好理解的方法就是,type()返回的是 对象或者类的创建者:

       1、 33的创建者是int,33.3的创建者是float,a的创建者是A。

       2、所有新式类的创建者为 type

       3、经典类的创建者为classobj

      在面向对象的说法中,我们最常听到就是一切皆对象。实例是对象,类其实也是对象,实例是由类创建的,那么类又是由谁创建的,Python类的type类作用就在于此,type类是Python里的元类,元类的功能就是创建新的类型。所有的新式类都由元类创建。

      特殊的经典类的创建者是classobj。它也是一种元类。

      type()函数就是拿到类或者对象的创建者。

    提示:如果对元类不了解的可以查看Python相关元类的知识。

  • 相关阅读:
    记通过身份证号计算是否成年
    mysql出现which is not functionally dependent on columns in GROUP BY clause报错
    Git操作之 git add 撤销、git commit 撤销
    laraval ueditor 上传图片失败
    jquery调用百度api连接实现网页实时刷新汇率
    Laravel框架使用maatwebsite/excel 导出表格样式自定义
    数字千分位格式化
    laravel 5.4 解决使用Excel::load()导入的excel文件中日期格式变为数字
    layui select可以使用jQuery的change事件
    Linux系统通过命令修改BT宝塔面板的默认8888端口
  • 原文地址:https://www.cnblogs.com/alvin2010/p/9356653.html
Copyright © 2020-2023  润新知