在Python中,如何将带参数的装饰器应用于类方法?

时间:2017-03-16 16:31:31

标签: python

关注http://www.artima.com/weblogs/viewpost.jsp?thread=240845,我写了装饰师extend_to_separated_input

class extend_to_separated_input(object):
    def __init__(self, separator):
        assert isinstance(separator, str), "The separator must be a string."
        self.separator = separator

    def __call__(self, parse_function):
        def wrapped_function(raw_conditions, *args, **kwargs):
            raw_conditions = raw_conditions.split(self.separator)
            return [parse_function(raw_condition, *args, **kwargs) for raw_condition in raw_conditions]
        return wrapped_function 

此装饰器适用于全局定义的函数,例如

import parse
fmt = "{word1} {word2}"
@extend_to_separated_input(separator="&&")
def _parse(string):
    return parse.parse(fmt, string).named

string = "foo bar && hello world"
print _parse(string)

打印结果

[{'word1': 'foo', 'word2': 'bar '}, {'word1': ' hello', 'word2': 'world'}]

这是我所期待的。 (这里我使用了parse模块)。但是,在我的实际用例中,_parse方法是一个类方法,而不是一个全局方法。但是,如果我尝试这样做:

class TwoWords(object):
    fmt = "{word1} {word2}"

    @classmethod
    @extend_to_separated_input(separator="&&")
    def _parse(cls, raw_condition):
        return parse.parse(cls.fmt, raw_condition).named

string = "foo bar && hello world"
print TwoWords._parse(string)

我得到了

AttributeError: type object 'TwoWords' has no attribute 'split'

问题是它正在把这个类作为第一个参数。我已尝试将定义调整为def wrapped_function(cls, raw_conditions, *args, **kwargs),但由于参数不足,这会导致TypeError

我如何调整装饰器以使其适用于类方法?

0 个答案:

没有答案