2013-09-27 9 views
0

當我需要創建一些複雜的對象時,我更喜歡爲它編寫構建器。 到目前爲止這是:編寫構建器和如何使用非本地的最佳方式:python

class Builder(object): 
    def before(self): 
     do.. 
    def build(self): 
     do stuff 
    def after(self): 
     do.. 

是單身,所以我一定要記住不要用建築參數自(線程重要),所以我需要通過許多參數生成器的方法中,或通過他們未完成的(半建)對象。或者每次創建新的建築物時創建建築物對象,這並不是一件好事。

但是當我開始使用python 3,我寧願助洗劑功能:

def builder(): 
    param1 = None 
    param2 = None 
    def before(self): 
     do.. 
    def build(): 
     nonlocal param1 
     build object ... 
    def after(self): 
     do.. 
    def ...(self): 
     do.. 

這似乎是更輕,線程安全的,不是嗎?這裏有風險嗎? 在哪裏/我可以如何應用非本地?

我現在rething Python的形式給出,以生成器模式我什麼,我發現是:

class Builder: 
    def build(self): 
     param = None 
     def _build_step1(): 

它給我生成器類,並使用build方法和嵌套方法在建築物內物體簡單的方法的參數化。

+0

那麼爲什麼它是一個單身? – delnan

+0

好吧,爲了避免創建許多構建器對象(它很重,所以我更喜歡方法),我寫了一些性能真正計數的地方,但沒有時間測試和計算所有這些東西。 –

+0

我敢打賭,你的表現擔憂是完全錯誤的。如果構建器對象本身很小,重複分配和取消分配要比跳過必要的箍來減少單例的缺點要便宜得多。如果構建器需要一些龐大的只讀數據結構,您可以在構建器中共享*,而不是在多個客戶端之間共享一個構建器。人們可以在不引入單例的情況下緩存或回收對象。你濫用這種設計模式。 – delnan

回答

0

您應該只是在Python中使用關鍵字參數而不是Java模式 - 換句話說,我不明白爲什麼您會在Python中使用生成器模式(如果有其他完美可用且更好的方法來編寫對象)。

class Person: 
    def __init__(self, name, age=UNKNOWN, gender=MALE): 
     self.name = name 
     self.age = age 
     self.gender = gender 

people.append(Person("Erik")) 
people.append(Person("John", age=27)) 
people.append(Person("Pamela", gender=FEMALE)) 
people.append(Person("OldDude", gender=MALE, age=99)) 
+0

但我是關於如何編寫對象需要解析或其他事情的情況 - 很多東西只是找到對象構造函數 的參數,所以我真的希望單獨的構建器保持構建邏輯。 模式是特定語言嗎? –

+0

是的,「pattern」通常是說「解決語言限制的解決方法」的很好方式 - 大多數Java/C#/ C++模式源於這些語言中表達式的限制。但是,也許你的對象構造真的很複雜,以至於需要一個專用的構建器機制......儘管我懷疑可選參數+一些內部幫助器/解析器方法仍然應該在保持界面「簡單」的Python的同時進行。 –

+0

其實我很好奇,看看你認爲是否需要使用構建器模式。 –

相關問題