2009-10-30 7 views
5

私は、工場の適切なコンセプトを把握していないようです。Pythonとファクトリ

誰も私に簡単なテストをコード化するのに役立つことができますか?私はインターネット上でいくつかのテキストを読んで、同じ方法でそれをコード化することはできません。実際に私はプロセスを理解できない。コードをコピーするのは簡単ですが、なぜこれが機能しないのかを知る必要があります。

class Factory: 

    def __init__(self): 
     self.msg = "teste" 

    def fabricateAnotherObject(self,obj,**kwargs): 
     return apply(obj,**kwargs) 

class testClass: 
    def __init__(self,nome,salario,endereco): 
     self.nome = nome 
     self.salario = salario 
     self.endereco = endereco 

    def __str__(self): 
     return "Nome: " + str(self.nome) + "\nEndereco: " + str(self.endereco) + "\nSalario: " + str(self.salario) 

a = Factory() 
emp = a.fabricateAnotherObject(testClass,"George",2000,"Three Four Five Avenue") 
print str(emp) 
+0

'apply()'の使い方は間違っています(キーワード引数はありません)。いずれの場合でも 'apply()'は廃止され、 'obj(** kwargs)'構文を使用します。 – jfs

答えて

13

あなたのコードは生産性が低い(申し訳ありませんが、私はそれを言う必要があります)。

工場の感覚は、作成したオブジェクトのクラスを作成する位置で知っている必要はありません。

オブジェクトの作成は、オブジェクト指向の抽象化にギャップを作ります。オブジェクトを作成するには具体的にする必要があります。しかし時には、いくつかの振る舞いを持つオブジェクトを作成したいだけですが、誰かが具体的なクラスを(中央で)決定する必要があります。

たとえば、100種類の場所に1種類のオブジェクトを作成する必要があります。しかし、後でクラスを変更しなければならないことが分かるかもしれません。クラスを変更する必要があります。

工場では、変更する必要がある場所を1つ定義することで、この必要性を排除します。

最も簡単な工場は、次のようになります。もちろん

def fabricateAnotherObject(self, **kwargs): 
    return testClass(**kwargs) 

、これはいくつかの状況で少し助けになるかもしれません。したがって、一部のファクトリでは、dbやその他の設定からクラス名をロードすることもあります。しかし、最も簡単な解決策は、オブジェクトのハードコード化された構築です。このメソッドは、このメソッドを常に呼び出すことを選択したときに変更する必要があります。

(DBを必要とせずに)いくらかより動的なソリューション:

class Factory(object): 
    def __init__(self, theClass): 
     self.theClass = theClass 
    def create(self, **kwargs): 
     self.theClass(**kwargs) 

myFactory = Factory(testClass) 

myFactoryインスタンスが正しいインスタンスを作成するための異なる場所で使用することができます。問題は、myFactoryを初期化する方法です - 特別なモジュールでいくつか?

+0

私の構築した例ではもちろん、ファクトリクラスは必要ありません。単純なファクトリ関数で十分です。自己パラメータが使用されていないことがわかります。 Juergen。 – Juergen

+0

。それはまさに私が必要なものです。私はあなたの言葉に感謝しなければならない。ここに掲載されているのは単なる例です。 –

+0

ああ、ちょうどオブジェクトが修正されていることに気づいた。私はちょうどdinamically選択する必要があります。私は何かを考えます。ありがとうございました:D –

0

あなたの製造方法は、次のようになります。

def fabricateAnotherObject(self, obj, *args): 
     return apply(obj, args) 

は、(適用)引数のリストになります。 fabricateAnotherObjectメソッドで* argsを取り込むことによって、apply()に渡すことができるリストとしてobjを超えたすべてのパラメータを消費します。

+0

downvote:これはコメントです。回答はありません – g33kz0r

4

ファクトリパターンは、関数(およびクラス)を一次値(C++やJavaなど)として使用できないプログラミング言語を対象としています。

考えられるのは、あるファンクション(またはメソッドまたはコンストラクタ)の引数として「ファクトリ」クラスのインスタンスを渡し、新しいオブジェクトインスタンスを生成するために使用されるというアイデアです(通常、これらは、事前に知られているスーパークラス)。

Pythonでは、代わりにクラスを渡すことができます(クラス(および関数)もオブジェクトであるため)。

0

type() in docs.pythonも参照してください。ORG /ライブラリ/機能:

タイプ(名前、塩基、辞書)

戻り、新しいタイプのオブジェクト。これは本質的にはclass文の動的形式です。 name文字列はクラス名であり、__name__属性になります。 ベースタプルはベースクラスを項目化し、__bases__属性になります。 であり、dict辞書はクラス本体 の定義を含む名前空間であり、__dict__属性になります。 たとえば、次の2つのステートメントは、同じタイプのオブジェクトを作成します。

工場の一つを使用して短い実際のプログラムのために
class X(object): 
    a = 1 
X = type('X', (object,), dict(a=1)) 

(コンパクト特別dictsの多くを構築する)、 ofc2.pyを参照してください。
エキスパート、より多くの例をお願いします。

関連する問題