【发布时间】:2020-12-09 04:05:51
【问题描述】:
我的CurrencyTools 类中有一套方法,我希望能够接受kwarg 不同货币缩写的输入。例如,我希望每个方法都接受“usd”或“eur”kwarg 参数。然而,为了进行计算,函数需要输入以美元为单位,因此每个方法的第一行都是使用self.convert_to_usd() 将非美元货币输入转换为美元。这个转换步骤似乎是重复的。如何创建一个调用类方法self.convert_to_usd 的装饰器来自动执行此转换“预处理”步骤并将转换后的美元金额传递给方法?我不确定装饰器如何到达self 来调用self.convert_to_usd 方法。
class CurrencyTools(object):
def __init__(self, eurusd_exchange_rate):
self.eurusd_exchange_rate = eurusd_exchange_rate
def convert_to_dollars():
#### ?? Decorator ?? ####
@convert_to_dollars
def do_calculation(self, **kwargs):
# usd = self.convert_to_usd(**kwargs) if 'usd' not in kwargs.keys() else kwargs['usd']
# decorator avoids repeating the line above at the start of every function
# do calculation with usd
def convert_to_usd(self, **kwargs):
return kwargs['eur'] * self.eurusd_exchange_rate
# example use
CurrencyTools(eurusd_exchange_rate=1.1).do_calculation(eur=100)
【问题讨论】:
-
类装饰器是一个可调用对象,它接受给定的
class对象作为参数并返回另一个class对象(通常是它所传递对象的修改版本)。我认为您想要的只是一个常规函数(或方法)装饰器,其第一个参数是函数(或方法)。