Python单例模式

看了很多IOLoop的代码, 有一个地方相信大家注意到了, 得到IOLoop对象的时候, 都是通过instance()返回的. 事实上,

IOLoop使用了单例模式. 在Tornado运行的整个过程中, 只有一个IOLoop实例. 仅需一个 IOLoop实例, 就可以处理全部

的IO事件.  以前学习J2EE的时候接触过Java的单例模式, 接下来看看Python是如何实现单例模式的.

#!/usr/bin/env python  
# -*- coding:utf-8 -*-  
  
import os  
  
class IOLoop(object):  
    @classmethod  
    def instance(cls):  
        if not hasattr(cls, "_instance"):  
            cls._instance = cls()  
        return cls._instance  
 
    @classmethod  
    def initialized(cls):  
        """Returns true if the singleton instance has been created."""  
        return hasattr(cls, "_instance")  
  
    def service(self):  
      print 'Hello,World'  
  
print IOLoop.initialized()  
ioloop = IOLoop.instance()  
ioloop.service()  
  
#if os.fork() == 0:
print IOLoop.initialized()  
ioloop = IOLoop.instance()  
ioloop.service() 


代码直接从ioloop.py文件抽取下来的, 演示了Python单例模式的实现方法. 实现相当简洁, 这得益于python强大的自省

功能. 代码中使用了cls, 这不是一个关键字, 像self一样, cls是python的一个built-in变量. self表示类的实例, 而cls表示类,

cls一般用于static method, 因为static method无须实例化就可以调用, 所以传递cls给static method. 然后调用cls()

可以创建对象. 就像调用IOLoop()一样. 

最后两句话:

 

Always use 'self' for the first argument to instance methods.

Always use 'cls' for the first argument to class methods.


自己也寫一了個

class A():
    _instalce = ''
    @classmethod
    def instance(cls):
        if not cls._instalce:
            cls._instalce = cls()
        return cls._instalce
    
    def say(self):
        print "Hello World!"






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值