覆盖实例方法的getattribute并使用方法输入变量

时间:2018-04-19 12:37:36

标签: python python-3.x python-2.7 oop getattribute

我有一个类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)    

否则,我想我可以使用某种“调用者”方法来调用各种方法,然后在返回之前格式化它们的输出...

1 个答案:

答案 0 :(得分:1)

这听起来就像一个装饰解决方案:

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

我不确定您是否要格式化输出或输入,但您可以同时执行这两项操作。