zoukankan      html  css  js  c++  java
  • python 面向对象专题(十四):元类(三): MetaClass使用

    用来指定当前类由谁来创建(默认type创建)

    通过参数 MetaClass 来指定当前的类是由那个类创建的

    使用type创建类

    第一个参数表示类名,第二个参数表示继承的类,第三个参数表示的指定其属性和方法

    Base = type('Base', (object,), {})

    简单的使用(一)

    class MyType(type):
        def __init__(self,*args,**kwargs):
            print('init')
            super(MyType,self).__init__(*args,**kwargs)
     
        def __call__(self, *args, **kwargs):
            print('call本质:调用类的__new__,再调用类的__init__')
            return super(MyType,self).__call__( *args, **kwargs)
     
     
    class Foo(metaclass=MyType):
        pass
     
    class Bar(Foo):
        pass
     
    obj = Bar() 

    运行结果如下

    我们可以看到Foo和Bar类都是由MyType类创建的,创建的他们的时候会先执行他们的__init__方法,对象obj是Bar类创建的,实例化对象的时候会执行__call__方法

     简单的使用(二)

    在这里使用的是通过tyoe动态的创建类

    class MyType(type):
        def __init__(self, *args, **kwargs):
            super(MyType, self).__init__(*args, **kwargs)
     
        def __call__(cls, *args, **kwargs):
            print('xxxx')
            return super(MyType, cls).__call__(*args, **kwargs)
     
     
    # Base = MyType('Base', (object,), {})
     
    # MyType('Base', (object,), {}) 是有MyType创建; metaclass=MyType
    # 1. type可以创建类metaclass=type;MyType也可以创建类metaclass=MyType
    # 2. Base = MyType('Base', (object,), {}) -->
    # class Base(metaclass=MyType):
    #     pass
    # class Foo(Base):
    #     pass
     
    class Foo(MyType('Base', (object,), {})):
        pass
    obj = Foo()

    简单的使用(三)  

     在这里在继承的时候通过函数返回一个类

    class MyType(type):
        def __init__(self, *args, **kwargs):
            super(MyType, self).__init__(*args, **kwargs)
    
        def __call__(cls, *args, **kwargs):
            return super(MyType, cls).__call__(*args, **kwargs)
    
    
    def with_metaclass(base):
        return MyType('XX', (base,), {})
    
    
    class Foo(with_metaclass(object)):
        pass
  • 相关阅读:
    Go语言中的管道(Channel)总结
    Go语言的构建方法总结
    Java里的equals总结
    Cracking the coding interview 第二章问题及解答
    2014年度总结
    一种识别验证码方法的介绍
    由记忆的角度分析我们学习为什么要知其所以然
    pvlan 配置
    f5 数据转发分析
    elasticsearch logstash kibana 研究第一篇
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14732408.html
Copyright © 2011-2022 走看看