看了很多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!"