eventmanager事件管理類實現,大概就百來行**左右。
# encoding: utf-8
# 系統模組
from queue import queue, empty
from threading import *
class eventmanager:
def __init__(self):
"""初始化事件管理器"""
# 事件物件列表
self.__eventqueue = queue()
# 事件管理器開關
self.__active = false
# 事件處理執行緒
self.__thread = thread(target = self.__run)
# 這裡的__handlers是乙個字典,用來儲存對應的事件的響應函式
# 其中每個鍵對應的值是乙個列表,列表中儲存了對該事件監聽的響應函式,一對多
self.__handlers = {}
def __run(self):
"""引擎執行"""
while self.__active == true:
try:
# 獲取事件的阻塞時間設為1秒
event = self.__eventqueue.get(block = true, timeout = 1)
self.__eventprocess(event)
except empty:
pass
def __eventprocess(self, event):
"""處理事件"""
# 檢查是否存在對該事件進行監聽的處理函式
if event.type_ in self.__handlers:
# 若存在,則按順序將事件傳遞給處理函式執行
for handler in self.__handlers[event.type_]:
handler(event)
def start(self):
"""啟動"""
# 將事件管理器設為啟動
self.__active = true
# 啟動事件處理執行緒
self.__thread.start()
def stop(self):
"""停止"""
# 將事件管理器設為停止
self.__active = false
# 等待事件處理執行緒退出
self.__thread.join()
def addeventlistener(self, type_, handler):
"""繫結事件和***處理函式"""
# 嘗試獲取該事件型別對應的處理函式列表,若無則建立
try:
handlerlist = self.__handlers[type_]
except keyerror:
handlerlist =
self.__handlers[type_] = handlerlist
# 若要註冊的處理器不在該事件的處理器列表中,則註冊該事件
if handler not in handlerlist:
def removeeventlistener(self, type_, handler):
"""移除***的處理函式"""
#讀者自己試著實現
def sendevent(self, event):
"""傳送事件,向事件佇列中存入事件"""
self.__eventqueue.put(event)
"""事件物件"""
class event:
def __init__(self, type_=none):
self.type_ = type_ # 事件型別
self.dict = {} # 字典用於儲存具體的事件資料
測試**
# encoding: utf-8
import sys
from datetime import datetime
from threading import *
from eventmanager import *
#事件名稱 新文章
event_artical = "event_artical"
class publicaccounts:
def __init__(self,eventmanager):
self.__eventmanager = eventmanager
def writenewartical(self):
#事件物件,寫了新文章
event = event(type_=event_artical)
event.dict["artical"] = u'如何寫出更優雅的**\n'
#傳送事件
self.__eventmanager.sendevent(event)
#*** 訂閱者
class listener:
def __init__(self,username):
self.__username = username
#***的處理函式 讀文章
def readartical(self,event):
print(u'%s 收到新文章' % self.__username)
"""測試函式"""
def test():
listner1 = listener("thinkroom") #訂閱者1
listner2 = listener("steve")#訂閱者2
eventmanager = eventmanager()
#繫結事件和***響應函式(新文章)
eventmanager.addeventlistener(event_artical, listner1.readartical)
eventmanager.addeventlistener(event_artical, listner2.readartical)
eventmanager.start()
publicacc = publicaccounts(eventmanager)
timer = timer(2, publicacc.writenewartical)
timer.start()
if __name__ == '__main__':
test()
驅動python Python資料驅動ddt
import ddt import unittest ddt模組包含了乙個類的裝飾器ddt和兩個方法的裝飾器 data 包含多個你想要傳給測試用例的引數 file data 會從json或yaml中載入資料 通常data中包含的每乙個值都會作為乙個單獨的引數傳給測試方法,如果這些值是用元組或者列表傳...
python python環境配置
python 3 教程 國內源 清華 https 阿里雲 http 中國科技大學 https 華中理工大學 http 山東理工大學 http 豆瓣 http 公升級 pip 到最新的版本 10.0 0 後進行配置 安裝django pip install django或 命令 yum install...
自學python python簡介
缺點 1.執行速度,有速度要求的話,用c 改寫關鍵部分吧。2.國內市場較小 國內以python來做主要開發的,目前只有一些web2.0公司 但時間推移,目前很多國內軟體公司,尤其是遊戲公司,也開始規模使用他。3.中文資料匱乏 好的python中文資料屈指可數 託社群的福,有幾本優秀的教材已經被翻譯了...