• Python内置类属性,元类研究


    Python内置类属性

    我觉得一切都是对象,对象和元类对象,类对象其实都是一样的,我在最后进行了证明,但是只能证明一半,最后由于元类的父类是type,他可以阻挡对object属性的访问,告终

    __dict__ : 类的属性(包含一个字典,由类的数据属性组成)

    __doc__ :类的文档字符串

    __name__: 类名

    __module__: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)

    __base__:类的第一个父类

    __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

    __class__:创建本对象的类

    __dict__

    对象加.能出来的就是存在它里面的。

    实验室

    例1

    从打印结果发现,z对象的__dict__()是空的,为啥他能打印出东西呢?它遵循下面的属性查找关系(需要对元类有了解)

    class zx():
        pass
    z=zx()
    print(z.__dict__)
    print(z.__module__)
    
    {}
    __main__
    

    例2

    代码中有两个属性被我注释了,为啥呢?因为它找到type都没有找到,会报错(可以把,zx,object,type__dict__都打印出来,然后在控制台搜索)

    class zx():
        pass
    print(zx)
    print(zx.__dict__)
    print(zx.__class__)
    print(zx.__bases__)
    print(object.__dict__)
    print(type.__dict__)
    print(zx.__name__)
    print(zx.__doc__)
    # print(zx.__slots__)
    print(zx.__qualname__)
    print(zx.__module__)
    # print(zx.__annotations__)
    print(zx.__mro__)
    

    于是属性查找应该分成两层,一层是对象层(基于c3算法的MRO)的查找,另外一个层则是类层(即元类层)的查找

    img

    class Mytype(type):
        name = "zxtype"
        def __new__(cls, *args, **kwargs):
            return type.__new__(cls, *args, **kwargs)
    
    class hi():
        # name = "hi"
        pass
    
    class ji(hi,metaclass=Mytype):
        # name = 'ji'
        pass
    
    # zx = ji()
    #
    # print(zx.name)
    
    print(ji.name)
    
    #查找顺序:自己的总结
    先找自己的,再从自己的继承关系找,在找元类的继承关系
    

    总结

    1.调用自己__dict__里面的方法的话直接对象调用就行了,而且不会默认传一个对象参数,如果没有用就要用到查找关系了

    2.对象
    先从自己的dict找

    再从自己的继承关系找

    先从元类中找

    最后从元类继承关系找

    元类的属性优先于元类的继承关系

    class cc():
        name="das"
    class zx(cc):
        name="20"
    z=zx()
    print(z.name)
    
    20
    
    class Mytype(type):
        name=20
    
    class zx(metaclass=Mytype):#zx=Mytype()
        pass
    
    print(zx.__doc__)
    
    None #type的__doc__不为None
    

    继承关系__bases__只有object有

    自己的继承关系优先于元类的属性

    class cc():
        name=20
    
    class Mytype(type):
        name=10
    
    class zx(cc,metaclass=Mytype):
        pass
    #相当于zx=Mytype(...)
    print(zx.name)
    
    20
    

    对象这块无法证明,对象没有__bases__方法,object也没有,但是type有

  • 相关阅读:
    slot 的简单使用(一)匿名插槽
    修改Tooltip 文字提示 的背景色 箭头颜色
    解决vue/cli3.0 语法验证规则 ESLint: Expected indentation of 2 spaces but found 4. (indent)
    洛谷P2014 选课(树形DP+分组背包)
    洛谷P4316 绿豆蛙的归宿(概率DP/期望DP+拓扑排序)
    Atcoder Beginner Contest 144 F- Fork the Road(概率DP/期望DP)
    Atcoder ABC144 Gluttony(贪心+二分)
    洛谷P1352 没有上司的舞会(树形DP+记忆化)
    HDU2476 String painter(区间DP)
    POJ1651 Multiplication Puzzle(区间DP+记忆化搜索)
  • 原文地址:https://www.cnblogs.com/zx125/p/11483414.html
Copyright © 2020-2023  润新知