python 单例模式的探究

来源:互联网 发布:剑三成女捏脸数据图片 编辑:程序博客网 时间:2024/06/05 18:04

1.__new__

>>> class Singleton(object):def __new__(cls,*args,**kwargs):if '_inst' not in vars(cls):cls._inst=super(Singleton,cls).__new__(cls,*args,**kwargs)return cls._instdef __init__(self,info):self.info=infodef say(self):print self.info>>> s=Singleton('gauss')               >>> s.say()gauss                    #1>>> s=Singleton('gausszh')>>> s.say()gausszh                  #2 说明初始化赋值的init函数还是有作用的>>> vars(Singleton)dict_proxy({'__module__': '__main__', '__new__': <staticmethod object at 0xa5200d4>, 'say': <function say at 0xb5835534>, '_inst': <__main__.Singleton object at 0xa52502c>, '__dict__': <attribute '__dict__' of 'Singleton' objects>, '__weakref__': <attribute '__weakref__' of 'Singleton' objects>, '__doc__': None, '__init__': <function __init__ at 0xb58354fc>})
>>> s=Singleton('gauss')>>> s.say()gauss>>> s<__main__.Singleton object at 0xa52502c>             #3>>> s=Singleton('gausszh')>>> s.say()gausszh>>> s<__main__.Singleton object at 0xa52502c>             #4 地址相同,那么是单例模式

2.用装饰器

先在你想要使用单例模式的作用域里定义一个instances={}>>> def singleton(cls):def getinstance(*args,**kwargs):if not instances.has_key(cls):instances[cls]=cls(*args,**kwargs)return instances[cls]return getinstance>>> @singletonclass MyClass():def __init__(self,info):self.info=infodef __call__(self,info):print infoprint self.__class__def say(self):print self.info>>> m=MyClass('gauss')>>> m.say()gauss                  #5>>> m<__main__.MyClass instance at 0xb5836bcc>          #7>>> m('hh')hh__main__.MyClass>>> m=MyClass('gausszh')>>> m.say()gauss                  #6装饰器在这里直接拦截了我们的类。在我们第二次想要用MyClass类生成一个对象的时候,被装饰器发现,装饰器果断就把这个MyClass第一次生成的对象返回给我们。所以第一次的时候,不论我们在init里干什么都是没有用的。:D>>> m<__main__.MyClass instance at 0xb5836bcc>          #8 地址相同>>> m('hh')hh__main__.MyClass

自省函数
id()       返回对象唯一的标识符
repr()       返回对象的标准字符串表达式
type()       返回对象的类型
dir()       返回对象的属性名称列表
vars()       返回一个字典,它包含了对象存储于其__dict__中的属性及值
hasattr()     判断一个对象是否有一个特定的属性
getattr()     取得对象的属性
setattr()     赋值给对象的属性
delattr()     从一个对象中删除属性
callable()    测试对象的可调用性
issubclass()  判断一个类是否为另一个类的子类或孙类
isinstance()  判断一个对象是否是另一个给定类的实例
super()       返回相应的父类


原创粉丝点击