從pyh看Python的工廠模式

2021-09-02 13:07:31 字數 3427 閱讀 1454

【設想】

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 建立具體產品類 繼承抽象產品類 ...