• Python_基础_(元类)


    一,

    在Python中一切皆对象,类本身就是一个对象,当使用关键字class创建一个类时,Python解释器在加载class时就会创建一个对象

    ## 证明一个类是type的对象的例子

    class Test:
        pass
    
    t = Test()
    print(type(t))      # <class '__main__.Test'>
    print(type(Test))   # <class 'type'>
    # t为类Test的对象
    # 类Test时类type的一个对象

    ## 什么是元类

    1,元类是类的类,是类的模板

    2,元类用来控制如何创建类的,正如创建对象的模板一样

    3,元类的示例为类,正如类的实例为对象(t为类Test的一个实例,类Test是type的一个实例)

    4,type是python的一个内建元类,用来控制直接生成类,python中任何class定义的类都是type实例化的对象

    ## 如何用type表示一个类

    class Test:
        pass
    print(Test) # <class '__main__.Test'>
    
    Test_1 = type("Test_1",(object,),{"x":1})    
    # type("类名",(类继承的类以元组形式写入),"类中的属性以字典方式写入")
    print(Test_1)   # <class '__main__.Test_1'>

    ## 用一个type表示一个类,并在类中添加方法

    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    # 备选内置方法 test
    def test(self):
        print("我是test方法")
    
    Test_1 = type("Test_1",(object,),{"x":1,"__init__":__init__,"test":test})
    print(Test_1)   # <class '__main__.Test_1'>
    t = Test_1("henry",18)
    print(t.x)      # 1
    print(t.name)   # henry
    print(t.test()) # 我是test方法 

    # 自定义元类

    如果一个类没有自定义自己的元类,那么它的元类就是type,除了使用type来作为自己的元类,用户也可通过继承type来自定义元类

    ## 自定义元类

    class MyType(type):
        def __init__(self,test_class,test_super,test_attr):
            print(test_class)   # 类Test的类名: Test
            print(test_super)   # 类Test的父类元组:()
            print(test_attr)    # 类Test的属性字典:{'__module__': '__main__', '__qualname__': 'Test'}
    
    class Test(metaclass=MyType):
        # Test = Mytype("Test",(),{})
        # 传了4个参数给MyType
        def __init__(self,name):
            self.name = name
    
    print(Test)         # 拿到对象Test
    t = Test("henry")   # 可以进行实例化
    print(t.__dict__)

    ....待完成

  • 相关阅读:
    [转]编程能力与编程年龄
    github for windows 使用
    github 改位置
    Linux下设置和查看环境变量
    Docker基础 :网络配置详解
    docker入门实战笔记
    Jenkins +Maven+Tomcat+SVN +Apache项目持续集成构建
    使用nsenter工具进入Docker容器
    Docker从入门到实战(四)
    Docker从入门到实战(三)
  • 原文地址:https://www.cnblogs.com/Doaoao/p/10171214.html
Copyright © 2020-2023  润新知