覆盖实例方法的 getattribute 并使用方法输入变量
override getattribute for instance methods and use method input variables
我有一个 class Titles
,其中包含生成许多不同标题所需的代码。每个标题方法都接受变量 rules
以便灵活地生成正确的标题。无论我调用哪种方法,我都想应用某些格式化步骤。例如,将所有浮点数四舍五入到一位小数。我试图通过 __getattribute__
执行此操作,但不知道如何将函数变量提供给它(即 rules
)。这可能吗? __getattribute__
是否可以访问输入变量?
这是一个简单的例子:
import re
class Titles:
def __init__(self, name):
self.name = name
def __getattribute__(self,attr):
res = object.__getattribute__(self, attr)() #I need to insert rules here
#somewhere into the function call
if isinstance(res, str):
return re.sub(
r'\d+\.\d{1,}', lambda m: format(float(m.group(0)), '.1f')
return res
def title(self, rules):
return '{} has spent {} hours on this project'.format(self.name, rules)
否则,我想我可以使用某种 'caller' 方法来调用各种方法,然后在返回之前格式化它们的输出...
这听起来像是装饰器解决方案:
import re
class Titles:
def __init__(self, name):
self.name = name
@title_decorator
def title(self, rules):
return '{} has spent {} hours on this project'.format(self.name, rules)
@staticmethod
@title_decorator
def title2(rules):
'Also works for {} staticmethods!'.format(rules)
def title_decorator(func):
def new_function(*args):
# do something on rules
func_result = func(*args)
# do something on func result
return func_result
return new_function
我不确定你是想格式化输出还是输入,但你可以两者都做。
我有一个 class Titles
,其中包含生成许多不同标题所需的代码。每个标题方法都接受变量 rules
以便灵活地生成正确的标题。无论我调用哪种方法,我都想应用某些格式化步骤。例如,将所有浮点数四舍五入到一位小数。我试图通过 __getattribute__
执行此操作,但不知道如何将函数变量提供给它(即 rules
)。这可能吗? __getattribute__
是否可以访问输入变量?
这是一个简单的例子:
import re
class Titles:
def __init__(self, name):
self.name = name
def __getattribute__(self,attr):
res = object.__getattribute__(self, attr)() #I need to insert rules here
#somewhere into the function call
if isinstance(res, str):
return re.sub(
r'\d+\.\d{1,}', lambda m: format(float(m.group(0)), '.1f')
return res
def title(self, rules):
return '{} has spent {} hours on this project'.format(self.name, rules)
否则,我想我可以使用某种 'caller' 方法来调用各种方法,然后在返回之前格式化它们的输出...
这听起来像是装饰器解决方案:
import re
class Titles:
def __init__(self, name):
self.name = name
@title_decorator
def title(self, rules):
return '{} has spent {} hours on this project'.format(self.name, rules)
@staticmethod
@title_decorator
def title2(rules):
'Also works for {} staticmethods!'.format(rules)
def title_decorator(func):
def new_function(*args):
# do something on rules
func_result = func(*args)
# do something on func result
return func_result
return new_function
我不确定你是想格式化输出还是输入,但你可以两者都做。