python手写单例模式_python如何实现单例模式

python如何实现单例模式?下面给大家带来七种不同的方法:

一:staticmethod

代码如下:class Singleton(object):

instance = None

def __init__(self):

raise SyntaxError('can not instance, please use get_instance')

def get_instance():

if Singleton.instance is None:

Singleton.instance = object.__new__(Singleton)

return Singleton.instance

a = Singleton.get_instance()

b = Singleton.get_instance()

print('a id=', id(a))

print('b id=', id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

二:classmethod

和方法一类似,代码:class Singleton(object):

instance = None

def __init__(self):

raise SyntaxError('can not instance, please use get_instance')

def get_instance(cls):

if Singleton.instance is None:

Singleton.instance = object.__new__(Singleton)

return Singleton.instance

a = Singleton.get_instance()

b = Singleton.get_instance()

print('a id=', id(a))

print('b id=', id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

三:类属性方法

和方法一类似, 代码:class Singleton(object):

instance = None

def __init__(self):

raise SyntaxError('can not instance, please use get_instance')

def get_instance():

if Singleton.instance is None:

Singleton.instance = object.__new__(Singleton)

return Singleton.instance

a = Singleton.get_instance()

b = Singleton.get_instance()

print(id(a))

print(id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

四:__new__

常见的方法, 代码如下:class Singleton(object):

instance = None

def __new__(cls, *args, **kw):

if not cls.instance:

# cls.instance = object.__new__(cls, *args)

cls.instance = super(Singleton, cls).__new__(cls, *args, **kw)

return cls.instance

a = Singleton()

b = Singleton()

print(id(a))

print(id(b))

五:装饰器

代码如下:def Singleton(cls):

instances = {}

def getinstance():

if cls not in instances:

instances[cls] = cls()

return instances[cls]

return getinstance

class MyClass:

pass

a = MyClass()

b = MyClass()

c = MyClass()

print(id(a))

print(id(b))

print(id(c))

六:元类

python2版:class Singleton(type):

def __init__(cls, name, bases, dct):

super(Singleton, cls).__init__(name, bases, dct)

cls.instance = None

def __call__(cls, *args):

if cls.instance is None:

cls.instance = super(Singleton, cls).__call__(*args)

return cls.instance

class MyClass(object):

__metaclass__ = Singleton

a = MyClass()

b = MyClass()

c = MyClass()

print(id(a))

print(id(b))

print(id(c))

print(a is b)

print(a is c)

或者:class Singleton(type):

def __new__(cls, name, bases, attrs):

attrs["_instance"] = None

return super(Singleton, cls).__new__(cls, name, bases, attrs)

def __call__(cls, *args, **kwargs):

if cls._instance is None:

cls._instance = super(Singleton, cls).__call__(*args, **kwargs)

return cls._instance

class Foo(object):

__metaclass__ = Singleton

x = Foo()

y = Foo()

print(id(x))

print(id(y))

python3版:class Singleton(type):

def __new__(cls, name, bases, attrs):

attrs['instance'] = None

return super(Singleton, cls).__new__(cls, name, bases, attrs)

def __call__(cls, *args, **kwargs):

if cls.instance is None:

cls.instance = super(Singleton, cls).__call__(*args, **kwargs)

return cls.instance

class Foo(metaclass=Singleton):

pass

x = Foo()

y = Foo()

print(id(x))

print(id(y))

七:名字覆盖

代码如下:class Singleton(object):

def foo(self):

print('foo')

def __call__(self):

return self

Singleton = Singleton()

Singleton.foo()

a = Singleton()

b = Singleton()

print(id(a))

print(id(b))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值