私は一束の計算を実行するPythonクラスを持っています。このクラスはさまざまな計算をサポートしています。これらの計算のそれぞれは実際に呼び出されるかどうかは関係ありません。ここに例があります:2つのクラスインスタンス間の数値のデルタを計算します
class MyCalc(object):
def __init__(user, query_date, award):
self.user = user
self.query_date = query_date
self.award = award
def balance(self): # this can be subtracted
return self.award.balance
def value(self): # this can be subtracted
if self.user.award_date > self.query_date:
return self.award.value * self.user.multiplier
return 0
def has_multiple_awards(self): # this can not be subtracted
return self.user.awards > 2
def as_pandas_series(self):
return pd.Series({'balance': self.balance(),
'value': self.value(),
'query_date': self.query_date,
'award': self.award,
'user': self.user})
私が欲しいのは、クラスの2つのインスタンスの違いを計算することです。私は次のアプローチを考え出しましたが、この方法に欠点があるかどうか、あるいはもっと良い方法があるかどうかはわかりません。
class Diff(object):
def __init__(self, a, b):
self.a = a
self.b = b
def __getattr__(self, attr):
getter = operator.attrgetter(attr)
closing = getter(self.a)()
opening = getter(self.b)()
return closing - opening
a = MyCalc()
b = MyCalc()
diff = Diff(a, b)
print(diff.calc_x) # calculate a.calc_x() - b.calc_x()
代わりに私はデコレータを追加することができますし、Diffのクラスを使用しないでください:
def differance(func):
def func_wrapper(self):
return func(self) - func(self.b)
return func_wrapper
class MyCalc(object):
@difference
def calc_x(self):
return some_calc
@difference
def calc_y(self):
return some_calc
すべてのフィードバックが理解されるであろう。
興味深い概念です。最初のやり方をやや効率的にする方法はありますが、あなたが持っているものはいいと思います。私はかなりデコレータ版を取得していません。 MyCalcの2番目のインスタンスを '.b'属性として最初のインスタンスに格納する必要があるようですが、これはちょっと面倒です。 –
はい、あなたは正しいです。デコレータのバージョンでは、MyCalcの2番目のインスタンスが必要です。ちょっと混乱しています。 – Johan
*「クラスが計算を実行します」*と言うと、単純に値のリスト(またはNumPy配列)? NumPyでベクトル減算を行うだけです。また、よりPythonicようです。あなたは* "すべての計算がそれぞれ順番に呼び出されます*"、またはより "*クラスはさまざまな計算をサポートしています、それぞれが特定のインスタンスで実際に呼び出されるかもしれないかもしれません" *か?操作が何であるか、それらがお互いにどのように関連しているか、それらが連続して呼び出されるかどうかについて、少しの文脈を私たちに伝えれば助かります... – smci