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
  • 相关阅读:
    Hackerrank--Emma and sum of products (FFT)
    Hdu 1402 (FFT)
    Hackerrank--Divisibility of Power(Math)
    Hackerrank--Stock Maximize(DP Practice)
    Codeforces 455B
    vim 简明教程(转自飘过的小牛)
    ACdream 1007 (快速幂)
    编写可维护的JS 02
    编写可维护的JS 01
    图片加载-从模糊到清晰
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14732408.html
Copyright © 2011-2022 走看看