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有

  • 相关阅读:
    5.3Role和Claims授权「深入浅出ASP.NET Core系列」
    【干货分享】可能是东半球最全的.NET Core跨平台微服务学习资源
    5.2基于JWT的令牌生成和定制「深入浅出ASP.NET Core系列」
    5.1基于JWT的认证和授权「深入浅出ASP.NET Core系列」
    4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
    4.4管道和中间件介绍「深入浅出ASP.NET Core系列」
    目录导航「深入浅出ASP.NET Core系列」
    4.3dotnet watch run「深入浅出ASP.NET Core系列」
    4.2WebHost配置「深入浅出ASP.NET Core系列」
    4.1ASP.NET Core请求过程「深入浅出ASP.NET Core系列」
  • 原文地址:https://www.cnblogs.com/zx125/p/11483414.html
Copyright © 2011-2022 走看看