0

以下に示すように、給与コンポーネントを計算するクラスがあります。

def normalize(func):
    from functools import wraps

    @wraps(func)
    def wrapper(instance, *args, **kwargs):
        allowanceToCheck = func(instance)
        if instance.remainingAmount <= 0:
            allowanceToCheck = 0.0
        elif allowanceToCheck > instance.remainingAmount:
            allowanceToCheck = instance.remainingAmount
        instance.remainingAmount = instance.remainingAmount - allowanceToCheck
        return allowanceToCheck
    return wrapper

class SalaryBreakUpRule(object):
    grossPay = 0.0
    remainingAmount = 0.0

    @property
    def basic(self):
     # calculates the basic pay according to predefined salary slabs.
     basic = 6600 # Defaulting to 6600 for now.
     self.remainingAmount = self.grossPay - basic
     return basic

    @property
    @normalize
    def dearnessAllowance(self):
      return self.basic * 0.2

    @property
    @normalize
    def houseRentAllowance(self):
      return self.basic * 0.4

   def calculateBreakUps(self, value = 0.0):
    self.grossPay = value
    return {
        'basic' : self.basic,
        'da' : self.dearnessAllowance,
        'hra' : self.houseRentAllowance
    }

各手当を計算する前に、すべての手当の合計がgrossPay、つまり私の給与総額を超えていないかどうかを確認する必要があります。各手当計算方法をラップし、上記の要件を実行するデコレータを作成しました。例えば、

* an employee having a salary of Rs.6700
* basic = 6,600 (according to slab)
* dearnessAllowance = 100 (cos 20% of basic is more than remaining amount)
* houseRentAllowance = 0.0 (cos 40% of basic is more than remaining amount)

しかし、残念ながらうまくいきませんでした。最初の許容値は正しく計算されますが、他のすべての許容値には最初の許容値と同じ値が与えられています。つまり、houseRentAllowance は、上記の 0.0 ではなく 100 になります。

私が見つけた問題は、コード行です

instance.remainingAmount = instance.remainingAmount - allowanceToCheck

クラスの変数を設定しようとしているデコレータでは機能しません。

この問題を解決する方法はありますか?

4

1 に答える 1