属性a
に格納されているインスタンス化時に単一のパラメーターを取るクラスがあります。_a
多くのメソッド (演算子)_b
については、結果に属性も設定する必要があります。これは現在、簡単な方法で実装されています。
class SomeClass(object):
def __init__(self, a=0):
self._a = a
self._b = 0
def __add__(self, other):
result = self.__class__()
result._b = self._a + other._a
return result
現在、や_b
など、のようなメンバーが多数あるため、これらの属性ごとに追加の行が必要になります。オブジェクトのインスタンス化でこれらを渡すことができると、よりクリーンなコードになります。_c
_d
__add__
class SomeClass(object):
def __init__(self, a=0, _b=0):
self._a = a
self._b = 0
def __add__(self, other):
return self.__class__(_b=self._a + other._a)
a
ただし、 as_b
を除くすべてのパラメーターの値をユーザーに渡すことは望ましくなく、_c
実装_d
の仕様です。複数の引数を渡さないように docstring で簡単に述べることができます。「プライベート」属性の前にアンダースコアを付けるのは、これを反映するためです。
別の方法として、2 番目のプライベート コンストラクターを提供することで、ユーザーが誤動作しにくくすることもできます。
class SomeClass(object):
def __init__(self, a=0):
self._a = a
self._init()
def _init(self, _b=0):
self._b = _b
@classmethod
def _constructor(cls, a, _b):
obj = cls(a)
obj._init(b)
return obj
def __add__(self, other):
return self.__class__._constructor(_b=self._a + other._a)
これはかなり厄介な解決策だと思います。
この問題を解決するための好ましい方法は何ですか? 他のよりエレガントなソリューションはありますか? これは本当に問題ですか。最初のオプションを使用して、さらにコード行を追加する必要がありますか?