__init__ で「self.x = x; self.y = y; self.z = z」パターンを回避するにはどうすればいいですか? 質問する

__init__ で「self.x = x; self.y = y; self.z = z」パターンを回避するにはどうすればいいですか? 質問する

次のようなパターンが見られます

def __init__(self, x, y, z):
    ...
    self.x = x
    self.y = y
    self.z = z
    ...

かなり頻繁に、多くの場合、より多くのパラメータを持ちます。この種の退屈な繰り返しを避ける良い方法はありますか?namedtuple代わりにクラスを継承する必要がありますか?

ベストアンサー1

免責事項:このソリューションの提示に懸念を抱いている方が数名いらっしゃるようですので、明確な免責事項を記載します。このソリューションは使用しないでください。このソリューションは情報として提供しているだけなので、この言語でこれが可能であることはご理解いただけると思います。回答の残りの部分は言語の機能を示すだけであり、この方法で使用することを推奨するものではありません。


パラメータを属性に明示的にコピーすることには、特に問題はありません。コンストラクターにパラメータが多すぎると、コード臭がすると考えられる場合があり、これらのパラメータを少数のオブジェクトにグループ化する必要があるかもしれません。それ以外の場合は、それが必要であり、何も問題はありません。とにかく、明示的に行うことが最善の方法です。

ただし、実行する方法(実行すべきかどうかではなく)を尋ねているため、1 つの解決策は次のとおりです。

class A:
    def __init__(self, **kwargs):
        for key in kwargs:
          setattr(self, key, kwargs[key])

a = A(l=1, d=2)
a.l # will return 1
a.d # will return 2

おすすめ記事