0
点赞
收藏
分享

微信扫一扫

【Python代码篇】-单例模式(五种实现单利方式)

(一)、如何反序的迭代一个序列?

# 如果是一个list,最来的解决方案是

tempList = [1,2,3,4]
tempList.reverse()
for x in tempList:
print x
# 如果不是一个list,最通用的解决方案
print '\n- - - - - - - - - - - -'
tempTuple = (1,2,3,4)
for i in range(len(tempTuple)-1,-1,-1):
print tempTuple[i]

(二)、 如何用Python来进行查询和替换一个文本字符串?

# Python 中的 replace() 可以进行字符串替换
tempStr = "Hello java, Hello Python , Use JavaScript"
print tempStr.replace("Hello","Use")

# Python 中的 sub() 可以用来查找并替换字符串, sub() 是使用正则来匹配
import re
rex = r'(Hello|Use)'
print re.sub(rex, 'Bye', tempStr)

(三)、使用Python实现单例模式。

  • 所谓单例就是一个类从始至终只能产生一个实例。
  • 方法一:使用new方法
  • new方法中把类实例绑定到类变量_instance上,如果cls._instance为None表示该类还没有实例化过,实例化该类并返回。如果cls_instance不为None表示该类已实例化,直接返回cls_instance
  • 方法二:使用装饰器(decorator)
  • 方法三:使用metaclass(元类)
  • 方法四:共享属性
  • 所谓单例就是所有的引用(实例,对象)拥有相同的属性和方法,同一个类的实例天生都会有相同的方法,那我们只需要保证同一个类所产生的实例都具有相同的属性。所有实例共享属性最简单直接的方法就是共享dict属性指向。
  • 方法五:Python模板

方法一 使用new方法

class SingleTon(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'_instance'):
cls._instance = object.__new__(cls,*args,**kwargs)
return cls._instance

class TestClass(SingleTon):
a = 1

test1 = TestClass()
test2 = TestClass()

print test1.a, test2.a
print id(test1),id(test2)

方法二:使用装饰器(decorator)

def SingleTon(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton

@SingleTon
class TestClass(object):
a = 1

test1 = TestClass()
test2 = TestClass()

print test1.a ,test2.a
test1.a = 2
print test1.a ,test2.a
print id(test1),id(test2)

方法三:使用metaclass(元类)

class SingleTon(type):
def __init__(cls,name,bases,dict):
super(SingleTon,cls).__init__(name,bases,dict)
cls._instance = None

def __call__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(SingleTon,cls).__call__(*args, **kwargs)
return cls._instance

class TestClass(object):
__metaclass__ = SingleTon

test1 = TestClass()
test2 = TestClass()

test1.a = 1
print test1.a ,test2.a
test1.a = 2
print test1.a ,test2.a
print id(test1),id(test2)

方法四:共享属性

class SingleTon(object):
_state = {}
def __new__(cls, *args, **kwargs):
obj = object.__new__(cls, *args, **kwargs)
obj.__dict__ = cls._state
return obj

class TestClass(SingleTon):
a = 1

print test1.a ,test2.a
test1.a = 2
print test1.a ,test2.a
print id(test1),id(test2)

方法五:Python模板

# 
class My_SingleTon(object):
def foo(self):
pass
my_sign = My_SingleTon()

my_sign.foo()


举报

相关推荐

0 条评论