• __metaclass__ 实现单列模式


    class Singleton(type):
    """Singleton.
    @see: http://stackoverflow.com/questions/6760685/creating-a-singleton-in-python
    """
    _instances = {}

    def __call__(cls, *args, **kwargs):
    if cls not in cls._instances:
    cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
    return cls._instances[cls]
    class Earth(object):
        __metaclass__ = Singleton

    def __init__(self,a,b): pass

    if __name__ == '__main__':
    e = Earth(1,2)

    理解

    1  类也是对象,在运行时需要被创建

    2 type 和元类 为创建类的类,创建类时先找__metaclass__,找不到就由type创建

    3 Singleton类中的__new__ 只会在开始运行时创建Earth类时被调用一次,以后对于Earth的实例化时先调用了Singleton的__call__方法,

       第一次E的实例化S会调用super,super内调用到了E的new,init(此处为唯一一次,以后对E实例化S的call只会返回第一次生成的实例,不会调用super)

    道生一,一生二,二生三,三生万物。(原文

    1.  即是 type
    2.  即是 metaclass(元类,或者叫类生成器)
    3.  即是 class(类,或者叫实例生成器)
    4.  即是 instance(实例)
    5. 万物 即是 实例的各种属性与方法,我们平常使用python时,调用的就是它们。

      

    type-->元类 --> 类 --> 实例 --> 属性与方法

    元类中:

    __new__ 有返回值,用于生成类

    __call__ 有返回值,使类可以像函数一样被调用,返回__new__生成类的实例

    type有一种完全不同的能力,它也能动态的创建类。type可以接受一个类的描述作为参数,然后返回一个类。(我知道,根据传入参数的不同,同一个函数拥有两种完全不同的用法是一件很傻的事情,但这在Python中是为了保持向后兼容性)

    type可以像这样工作:

    type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
    
    返回值为 类对象
  • 相关阅读:
    9月16日 星期二 晴
    谁能联系到小爱
    初学者请教Reporting Service达人,小女给能够进来看一眼的好心人抱拳一拜
    9月19日 多云
    iPhone开发教程之Core Data 常见问题的总结
    移动终端开发必备知识
    Core Data 教程(3): 入门指南
    【转载】APK反破解之四:Android代码动态加载技术
    REST是什么
    (转载)设计师必备工具推荐(上)【译】
  • 原文地址:https://www.cnblogs.com/hei-hei-hei/p/9590929.html
Copyright © 2020-2023  润新知