单例模式和装饰器

1 使用__new__方法


class Singleton(object):

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

        if not hasattr(cls, '_instance'):

            orig = super(Singleton, cls)

            cls._instance = orig.__new__(cls, *args, **kw)

        return cls._instance

class MyClass(Singleton):

    a = 1

>>> one = MyClass()

>>> two = MyClass()

>>> one == two

True

>>> one is two

True

>>> id(one), id(two)

(4303862608, 4303862608)

2 共享属性

创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法.

class Borg(object):

    _state = {}

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

        ob = super(Borg, cls).__new__(cls, *args, **kw)

        ob.__dict__ = cls._state

        return ob

class MyClass2(Borg):

    a = 1

3 装饰器版本

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

    instances = {}

    def getinstance():

        if cls not in instances:

            instances[cls] = cls(*args, **kw)

        return instances[cls]

    return getinstance

@singleton

class MyClass:



装饰器

def deco(func):

    def _deco():

        print 'before func'

        func()

        print 'after func'

    return _deco

@deco

def myfunc():

    print 'myfunc() called'

myfunc()

执行结果

[图片]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例(Singleton)是一种非常常见的设计模式,通过单例模式应该达到: 一个类只能有一个实例 该实例可被访问 ...
    MontyOak阅读 2,806评论 0 0
  • python的函数参数传递 看两个例子: 所有变量都可以理解为内存中一个对象的“引用”,或者,可以看做C中的vio...
    marvinxu阅读 11,115评论 2 30
  • 日本神户,在一个飘雪的冬天,渡边博子站在风雪中,她一身黑衣,肩上是飘落的雪花,身旁是面容悲切的人群,肃穆的场景一如...
    鱼耗子阅读 1,280评论 0 0
  • 澄沙之味,这些历经种种,才最终展现在你面前的红豆沙,是不是就是人生的真味? 漫漫岁月的哪一个春天的樱花疏影里,一个...
    刘海峰6阅读 3,907评论 0 0