在函数的构造过程中,如果多个对象之间的创建值一样,为了避免内存浪费,所以使用单例模式,共用一个对象。
如果使用以下代码则会产生2种不同地址(id值不一致)
class Foo(object): def init(self): pass def process(self): return '123' obj1=Foo() obj2=Foo() print(id(obj1),id(obj2))
如何让obj1和obj2拥有一个对象地址呢?
class Foo(object): instance=None def __init__(self): self.name='PandaJ' @classmethod def get_instance(cls): if Foo.instance: return Foo.instance else: Foo.instance=Foo() return Foo.instance def process(self): return '123' obj1=Foo.get_instance() obj2=Foo.get_instance() print(id(obj1),id(obj2))
这种方法使用@classmethod将函数转为类的方法可以实现obj1和obj2的地址一样,证明使用了同一个对象
可是这样的调用方式改变了用户直接使用obj=Foo()这种方式,有没有更好的方法呢?
class Foo(object): instance=None def __init__(self): self.name='PandaJ' def __new__(cls, *args, **kwargs): if Foo.instance: return Foo.instance else: Foo.instance = object.__new__(cls, *args, **kwargs) return Foo.instance def process(self): return '123' obj1=Foo() obj2=Foo() print(id(obj1),id(obj2))
本方法使用new的内置函数去构造一个实例,这样的话在每次用户执行Foo()时,都会调用new函数,如果有instance则直接赋值,如果没有则生成一个instance实例,保证了单例性。