有没有更具Python风格的方式实现优先扣费的钱包支付逻辑?
我完全理解你想要实现按优先级扣费的需求——优先花Upper口袋里的钱,当Upper的金额不够支付时,再从Lower口袋补差额。你当前的代码确实绕了点,逻辑不够直观,而且如果以后要加更多口袋的话,扩展起来会很麻烦。咱们来简化一下,让代码更清晰、更易扩展。
先看看你现有代码的小问题:比如sum([self.Upper+self.Lower])其实没必要,直接self.Upper + self.Lower就够了;后面计算剩余Upper和Lower的方式有点间接,没有直接体现“优先扣Upper”的核心逻辑,反而像是在重新分配剩余金额。
优化后的基础版本(贴合优先级扣费逻辑)
这个版本直接按优先级顺序扣费,逻辑一目了然:
class Wallet: Upper = 5 Lower = 5 @classmethod def Pay(cls, cost): # 先检查总余额是否足够支付 if cls.Upper + cls.Lower < cost: print('Purchase failed; the product is too expensive.') return # 第一步:优先扣Upper口袋的钱 deducted_from_upper = min(cls.Upper, cost) cls.Upper -= deducted_from_upper remaining_cost = cost - deducted_from_upper # 第二步:如果还有剩余费用,从Lower口袋扣 if remaining_cost > 0: cls.Lower -= remaining_cost # 输出剩余金额 print(f'Upper pocket: {cls.Upper}\nLower pocket: {cls.Lower}') Wallet.Pay(7)
运行这段代码后,Upper会剩下5-5=0,Lower剩下5-2=3,正好符合优先级扣费的预期。
更易扩展的版本(支持多口袋优先级)
如果以后你想加更多口袋(比如Middle、Emergency等),可以把口袋做成一个按优先级排序的集合,这样扩展的时候只需要新增口袋,不用改扣费逻辑:
class Wallet: # 字典的key顺序就是优先级(前面的先扣费) pockets = {'Upper': 5, 'Middle': 3, 'Lower': 5} @classmethod def Pay(cls, cost): total_balance = sum(cls.pockets.values()) if total_balance < cost: print('Purchase failed; the product is too expensive.') return remaining_cost = cost # 按优先级遍历口袋依次扣费 for pocket_name in cls.pockets: if remaining_cost <= 0: break # 扣当前口袋能承担的最大金额 deduct_amount = min(cls.pockets[pocket_name], remaining_cost) cls.pockets[pocket_name] -= deduct_amount remaining_cost -= deduct_amount # 输出所有口袋的剩余金额 for name, amount in cls.pockets.items(): print(f'{name} pocket: {amount}') # 测试:扣10元,会先扣Upper的5,再扣Middle的3,最后扣Lower的2 Wallet.Pay(10)
这个版本的扩展性极强,新增口袋只需要在pockets字典里按优先级顺序添加即可,完全不用动扣费的核心逻辑。
这样的实现既简洁又符合你的需求,而且不管现在还是未来扩展,逻辑都清晰易懂~
内容的提问来源于stack exchange,提问作者Chlodio
相关产品推荐
相关产品推荐

