【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()
发布了375 篇原创文章 · 获赞 180 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_41856814/article/details/104415889
今日推荐