1. ホーム
  2. python

PythonにおけるBuilderパターン相当

2023-10-02 16:39:56

質問

Javaでは ビルダパターン は、多くのパラメータを持つクラスをインスタンス化するための、より読みやすい手段を提供します。ビルダーパターンでは、名前の付いた属性を設定するメソッドを持つ設定オブジェクトを構築し、それを使って別のオブジェクトを構築します。

Pythonでこれに相当するものは何でしょうか?同じ実装を模倣するのが一番良い方法でしょうか?

どのように解決するのですか?

デザインパターンは、多くの場合、組み込みの言語機能で置き換えることができます。

あなたのユースケース

多くのパラメータを持つクラスをインスタンス化するための、より読みやすい手段"を持ちたかったとありますね。Javaの場合。

[ビルダパターンのユースケースは、構築するオブジェクトのコンストラクタが非常に多くのパラメータを取る必要がある場合です。このような場合、そのような設定パラメータをビルダオブジェクトにまとめる方が便利なことが多いのです ( setMaxTemperature(int t) , setMinTemperature(int t) , set .. など。など) の方が、クラスのコンストラクタに渡す引数の長いリストで呼び出し側に負担をかけるよりいいでしょう。 .

Builderパターン不要

しかし、Pythonは 名前付きパラメータ という具合に、クラス・コンストラクタを定義すればよいのです。クラスのコンストラクタを定義すればよいのです。

class SomeClass(object):
    def __init__(self, foo="default foo", bar="default bar", baz="default baz"):
        # do something

で、名前付きパラメータを使って呼び出す。

s = SomeClass(bar=1, foo=0)

引数の順序を自由に変更したり、省略したりできることに注意してください。 set メソッドの呼び出しを省略したり並べ替えたりできるのと同じです。

また、Pythonの動的な性質は、オブジェクトの構築に関してより多くの自由を与えてくれます( __new__ など) を使ってオブジェクトを構築する自由度が高く、ビルダーパターンの他の使い方を置き換えることができます。

しかし、本当に使いたいのであれば

を使うことができます。 collections.namedtuple を設定オブジェクトとして使用します。 namedtuple() は、定型クラスを書くことなく、各パラメータが与えられた名前を持つタプルを表す新しい型を返します。生成された型のオブジェクトは、Javaビルダーと同様の方法で使用することができます。(これは Paul McGuire に感謝します)。

StringBuilder

関連するパターンとして、Java の StringBuilder があり、これは効率的に (不変の) String を段階的に構築するために使用されます。Pythonでは、これは次のように置き換えることができます。 str.join . 例えば

final StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100; i++)
    sb.append("Hello(" + i + ")");
return sb.toString();

は、以下のように置き換えることができます。

return "".join(f"Hello({i})" for i in range(100))