1.装饰器
def singleton(cls):
instances = {}
def getinstance(*args,**kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
def __init__(self,s):
self.s = s
a = MyClass('apple')
b = MyClass('banana')
print(a.s)
print(b.s)
输出:
apple
apple
当一个类名不在字典内时,创建这个类的实例并作为值对应类名这个键,创建一个键值对在 instances
字典内,以后创建这个类的实例时,因为类名已存在,返回的还是第一次创建的类的实例。
2.模块
python中的模块module
在程序中只被加载一次,本身就是单例的。
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
3. __new__()
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton,cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self,s):
self.s = s
a = MyClass('apple')
b = MyClass('banana')
输出都是 banana
通过__new__
方法,将类的实例在创建的时候绑定到类属性 _instance
上。如果 cls._instance
为None
,说明类还未实例化,实例化并将实例绑定到 cls._instance
,以后每次实例化的时候都返回第一次实例化创建的实例。
以上是我了解的方法,如果还有其他方法可以告知我,我来加上去
网友评论