Hello World

python单例模式

单例模式:是指 一个类的实例从始至终只能被创建一次。

 

1 模块导入的方式

导入的模块中有实例化的对象,该对象就是单例模式。仅在模块导入的时候实例化一次,之后就可以使用该对象。

如CRM中v1.py中实例化的site:

site = MySite()   #实例化对象,在此就是 单例模式

 

 

2 实例化先执行函数的方式

class Foo:
    _instance = None

    def __init__(self):  # 2 实例化对象
        pass

    @classmethod
    def get_instance(cls):
        if cls._instance:
            return cls._instance # 4 再次执行函数的时候执行,返回的仍然是obj
        else:
            obj = cls()   # 1 下面执行的时候先执行这里,然后执行__init__
            cls._instance = obj # 3 对类属性_instance赋值
            return obj

f1 = Foo.get_instance()
f2 = Foo.get_instance()

print(f1)
print(f2)


# <__main__.Foo object at 0x02EF55F0>
# <__main__.Foo object at 0x02EF55F0>

 

在单例模式中的__init__中传参数并调用参数

class Foo:
    _instance = None

    def __init__(self,name):  # 2 实例化对象
        self.name = name  # 传入参数

    @classmethod
    def get_instance(cls,*args,**kwargs):  # 接收参数
        if cls._instance:
            return cls._instance # 4 再次执行函数的时候执行,返回的仍然是obj
        else:
            obj = cls(*args,**kwargs)   # 1 下面执行的时候先执行这里,然后执行__init__
            cls._instance = obj # 3 对类属性_instance赋值
            return obj

f1 = Foo.get_instance("asdfasdf") # 实例化对象
f2 = Foo.get_instance("zds")

print(f1.name)  # 执行对象的方法
print(f2.name)

print(f1)
print(f2)

# asdfasdf
# asdfasdf
# <__main__.Foo object at 0x03364490>
# <__main__.Foo object at 0x03364490>

 

3 __new__ 的方式

上面的方式调用的时候和普通的实例化不一致,通过__new__改造成与普通实例化一致的方式

__new__是创建实例的方法,__init__是类创建实例后调用,所以__new__先执行

 

 

#---------- 单例类定义 -------------

class Foo(object):
    
    __instance = None
    
    @staticmethod
    def singletion():
        if Foo.__instance:
            return Foo.__instance
        else:
            Foo.__instance = Foo()
            return Foo.__instance



#---------- 获取实例  ---------------

obj = Foo.singletion()

 

class Foo:
    _instance = None

    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):
        if cls._instance:
            return cls._instance
        else:
            # obj = super().__new__(cls,*args,**kwargs)
            obj = object.__new__(cls, *args, **kwargs)  # 所有的类都是object创建的
            cls._instance = obj
            return obj


f1 = Foo()
f2 = Foo()

print(f1)
print(f2)

 

 

 

 

 

 

 

对于Python单例模式,创建对象时不能直接使用: obj = Foo( ),而应该调用特殊的方法: obj = Foo.singleton( )

posted @ 2017-10-18 16:11  nayike  阅读(164)  评论(0编辑  收藏  举报

Hello