zoukankan      html  css  js  c++  java
  • 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有

  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/zx125/p/11483414.html
Copyright © 2011-2022 走看看