• Python--metaclass 元类 及对应实现的单例模式


    代码摘自书籍<<人人都懂设计模式>>

    元类(C-8):

    class CustomMetaclass(type):
        def __init__(cls, what, bases=None, dict=None):
            # 这个方法只会调用一次
            print('CustomMetaclass.__init__ cls:', cls)
            super().__init__(what, bases, dict)
    
        def __call__(cls, *args, **kwargs):
            # 每次实例化对象都会调用此方法
            print('CustomMetaclass.__call__ args:', args, kwargs)
            self = super(CustomMetaclass, cls).__call__(*args, **kwargs)
            print('CustomMetaclass.__call__ self:', self)
            return self
    
    
    class CustomClass(metaclass=CustomMetaclass):
        def __init__(self, *args, **kwargs):
            print('CustomClass.__init__ self:', self)
            super().__init__()
    
        def __new__(cls, *args, **kwargs):
            self = super().__new__(cls)
            print('CustomClass.__new__ self:', self)
            return self
    
        def __call__(self, *args, **kwargs):
            print('CustomClass.__call__ args:', args)
    
    
    obj = CustomClass('Meta arg1', 'Meta arg2', kwarg1=1, kwarg=2)
    print(type(CustomClass))
    print(obj)
    obj('arg1', 'arg2')
    obj2 = CustomClass('Meta obj2 arg1', 'Meta obj2 arg2', kwarg1=1, kwarg=2)
    print(obj)
    obj2('obj2 arg1', 'obj2 arg2')
    
    
    ''' 输出结果
    CustomMetaclass.__init__ cls: <class '__main__.CustomClass'>
    CustomMetaclass.__call__ args: ('Meta arg1', 'Meta arg2') {'kwarg1': 1, 'kwarg': 2}
    CustomClass.__new__ self: <__main__.CustomClass object at 0x000001B4B38AB630>
    CustomClass.__init__ self: <__main__.CustomClass object at 0x000001B4B38AB630>
    CustomMetaclass.__call__ self: <__main__.CustomClass object at 0x000001B4B38AB630>
    <class '__main__.CustomMetaclass'>
    <__main__.CustomClass object at 0x000001B4B38AB630>
    CustomClass.__call__ args: ('arg1', 'arg2')
    CustomMetaclass.__call__ args: ('Meta obj2 arg1', 'Meta obj2 arg2') {'kwarg1': 1, 'kwarg': 2}
    CustomClass.__new__ self: <__main__.CustomClass object at 0x000001B4B38AB5F8>
    CustomClass.__init__ self: <__main__.CustomClass object at 0x000001B4B38AB5F8>
    CustomMetaclass.__call__ self: <__main__.CustomClass object at 0x000001B4B38AB5F8>
    <__main__.CustomClass object at 0x000001B4B38AB630>
    CustomClass.__call__ args: ('obj2 arg1', 'obj2 arg2')
    '''
    View Code

    单例设计模式(5-3):

    class Singleton2(type):
        def __init__(cls, what, bases=None, dict=None):
            print('Singleton2.__init__ start')
            super().__init__(what, bases, dict)
            print('Singleton2.__init__ end')
            cls._instance = None
    
        def __call__(cls, *args, **kwargs):
            print('Singleton2.__call__ start')
            if cls._instance is None:
                print('Singleton2.__call__ super')
                cls._instance = super().__call__(*args, **kwargs)
            print('Singleton2.__call__ end')
            return cls._instance
    
    
    class CustomClass(metaclass=Singleton2):
        def __init__(self, name):
            self.__name = name
    
        def get_name(self):
            return self.__name
    
    
    tony = CustomClass('Tony')
    karry = CustomClass('Karry')
    print(tony.get_name(), karry.get_name())
    print('id(tony):', id(tony), 'id(karry):', id(karry))
    print('tony==karry:', tony == karry)
    
    
    ''' 输出结果
    Singleton2.__init__ start
    Singleton2.__init__ end
    Singleton2.__call__ start
    Singleton2.__call__ super
    Singleton2.__call__ end
    Singleton2.__call__ start
    Singleton2.__call__ end
    Tony Tony
    id(tony): 2488074155680 id(karry): 2488074155680
    tony==karry: True
    '''
    View Code
  • 相关阅读:
    报数游戏
    Dynamics CRM 2013 初体验(2):UI
    Lucene.net常见功能实现知识汇总
    hdu 1853 最小费用流好题 环的问题
    MessagerService总结
    [置顶] Android EditText/TextView使用SpannableString显示复合文本
    MySQL Dll语句
    JavaScript表单验证
    intellij—idea14 注冊机
    OL记载Arcgis Server切片
  • 原文地址:https://www.cnblogs.com/yarightok/p/15335012.html
Copyright © 2020-2023  润新知