37,719
社区成员
发帖
与我相关
我的任务
分享
# -*- coding:utf-8 -*-
#因为__new__在__init__前被执行,利用__new__实现单例
#创建过的单例带有属性__instance
class Singleton1(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'__instance'):
cls.__instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
return cls.__instance
#利用__dict__来引用同一个字典
class Singleton2(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton2, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
#利用元类在创建方法时用__metaclass__来创建
class Singleton3(type):
def __new__(cls, name, bases, dct):
if not hasattr(cls, '__instance'):
cls.__instance = super(Singleton3, cls).__new__(cls, name, bases, dct)
return cls.__instance
#利用装饰器
def singleton4(cls, *args, **kwargs):
instances = {}
def _single():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _single
class Myclass1(Singleton1):
a = 1
class Myclass2(Singleton2):
a = 2
class Myclass3(object):
__metaclass__ = Singleton3
a = 3
@singleton4
class Myclass4(object):
a = 4
if __name__ == "__main__":
s1 = Myclass1()
s2 = Myclass1()
s1.a = 44
print s2.a
s3 = Myclass2()
s4 = Myclass2()
s3.a = 44
print s4.a
s5 = Myclass3()
s6 = Myclass3()
s5.a = 44
print s6.a
s7 = Myclass4()
s8 = Myclass4()
s7.a = 44
print s8.a
# -*- coding:utf-8 -*-
# 因为__new__在__init__前被执行,利用__new__实现单例
# 创建过的单例带有属性__instance
class Singleton1(object):
"""不可以被再继承,不然__new__方法失效"""
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
return cls._instance
# 利用__dict__来引用同一个字典
class Singleton2(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton2, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
# 利用元类在创建方法时用__metaclass__来创建
class Singleton3(type):
def __init__(self, *args, **kwargs):
self.__instance = None
super(Singleton3, self).__init__(*args, **kwargs)
def __call__(self, *args, **kwargs):
if self.__instance is None:
self.__instance = super(Singleton3, self).__call__(*args, **kwargs)
return self.__instance
# 利用装饰器
def singleton4(cls, *args, **kwargs):
instances = {}
def _single():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _single
class Myclass1(Singleton1):
a = 1
class Myclass2(Singleton2):
a = 2
class Myclass3(object):
__metaclass__ = Singleton3
a = 3
@singleton4
class Myclass4(object):
a = 4
s1 = Singleton1()
s2 = Singleton1()
s1.a = 44
print(s2.a)
s3 = Myclass2()
s4 = Myclass2()
s3.a = 44
print(s4.a)
s5 = Myclass3()
s6 = Myclass3()
s5.a = 44
print(s6.a)
s7 = Myclass4()
s8 = Myclass4()
s7.a = 44
print(s8.a)