【設想】
1、編寫各種tag型別,如head、title、body;
2、過載 + 運算,實現類似html + head的功能;
想到第一點,當時就覺得繁瑣,要定義如此多個類(原諒我當時傻傻的),後來發現個開源專案:
【pyh工廠模式解析】
pyh就乙個原始碼pyh.py,很簡單,以下擷取部分**分析,請尊重原作者,不要直接使用
定義乙個基礎類,並過載+操作符,過載《過載符
[python] view plaincopy
class tag(list):
tagname = ''
def __init__(self, *arg, **kw):
self.attributes = kw
if self.tagname :
name = self.tagname
self.isseq = false
else:
name = 'sequence'
self.isseq = true
self.id = kw.get('id', name)
#self.extend(arg)
for a in arg: self.addobj(a)
def __iadd__(self, obj):
if isinstance(obj, tag) and obj.isseq:
for o in obj: self.addobj(o)
else: self.addobj(obj)
return self
def addobj(self, obj):
if not isinstance(obj, tag): obj = str(obj)
id=self.setid(obj)
setattr(self, id, obj)
def setid(self, obj):
if isinstance(obj, tag):
id = obj.id
n = len([t for t in self if isinstance(t, tag) and t.id.startswith(id)])
else:
id = 'content'
n = len([t for t in self if not isinstance(t, tag)])
if n: id = '%s_%03i' % (id, n)
if isinstance(obj, tag): obj.id = id
return id
def __add__(self, obj):
if self.tagname: return tag(self, obj)
self.addobj(obj)
return self
def __lshift__(self, obj):
self += obj
if isinstance(obj, tag): return obj
def render(self):
result = ''
if self.tagname:
result = '<%s%s%s>' % (self.tagname, self.renderatt(), self.selfclose()*' /')
if not self.selfclose():
for c in self:
if isinstance(c, tag):
result += c.render()
else: result += c
if self.tagname:
result += '' % self.tagname
result += '\n'
return result
def renderatt(self):
result = ''
for n, v in self.attributes.iteritems():
if n != 'txt' and n != 'open':
if n == 'cl': n = 'class'
result += ' %s="%s"' % (n, v)
return result
def selfclose(self):
return self.tagname in selfclose
然後定義工廠類
[python] view plaincopy
def tagfactory(name):
class f(tag):
tagname = name
f.__name__ = name
return f
最後實現工廠模式
[python] view plaincopy
for t in tags: setattr(thismodule, t, tagfactory(t))
【pyh生成html】
[python] view plaincopy
#生成乙個page物件
report_html = pyh(ur'樂視頁面測試報告')
'''''可以使用《運算子往page類新增tag節點,可新增的如下
tags = ['html', 'body', 'head', 'link', 'meta', 'div', 'p', 'form', 'legend',
'input', 'select', 'span', 'b', 'i', 'option', 'img', 'script',
'table', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'fieldset', 'a', 'title', 'body', 'head', 'title', 'script', 'br', 'table',
'ul', 'li', 'ol']
'''
report_html << h1(u'樂視頁面測試報告',cl='header1',style='color:red; text-align:center')
#tag物件,也可以使用《往裡面新增節點
myul = report_html << ul(cl='ul_report')
logintb = myul << table(cl='tb_login',border=2)
logintb << tr(cl='tb_tr') << td(cl='tb_login_head') << p(u'登入測試用例: 1 個',style='color:blue; text-align:center')
#最後使用printout輸出到檔案或者console
report_html.printout('result.html')
從self cls看Python的例項化 md
剛開始學習python的時候經常會有乙個疑問,為什麼每個類方法的第乙個參與一定要加乙個self?經過一定的編碼後發現,怎麼還有一些類方法裡面寫的是cls?在使用類方法的時候,我們通常會把乙個類做例項化之後再進行呼叫,比如這樣 class calc object defadd self,x,y pri...
Python下的設計模式學習(1) 簡單工廠模式
使用物件導向的思想設計乙個簡單的計算器類 基於物件導向的四個原則即使得 具有可維護,可復用,可擴充套件,靈活性好的特點 我們需要通過封裝,繼承,多型把程式的耦合度降低。將程式的業務邏輯於介面邏輯分開,讓它們之間的耦合度下降,才可以達到容易維護和擴充套件。比如該問題,使用者只需要知道使用特定的符號,以...
Python的建立型設計模式(三) 工廠方法模式
3.1.1 原理 工廠方法模式,是簡單工廠模式的衍生,又稱工廠模式 多型工廠模式和虛擬構造器模式,通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。步驟 1 建立抽象工廠類,定義具體工廠的公共介面 2 建立抽象產品類 定義具體產品的公共介面 3 建立具體產品類 繼承抽象產品類 ...