Python - Decorator模仿jQuery getter和setter

时间:2013-03-16 10:15:33

标签: python decorator

有没有办法知道一个方法所属的类。在下面的代码中,我想构建一个装饰器,如果函数get_f_name没有参数,则可以调用名为set_f_namef的方法。我的想法是构建一个模仿jQuery的getter-setter语法的装饰器。

要做到这一点,我必须知道函数f来自哪个类。

def jqueryize(f):
#    ????

class Test():
    def __init__(self):
        self.string      = "A little text..."
        self.dictionnary = {
            'key_1': 12345,
            'key_2': [1, 2, 3, 4, 5]
        }
        self.boolean = True

    @jqueryize
    def data(
        self,
        string      = None,
        dictionnary = None,
        boolean     = None
    ):
        ...

    def set_data(
        self,
        string,
        dictionnary,
        boolean
    ):
        ...

    def get_data(self):
        print(
            self.string,
            self.dictionnary,
            self.boolean,
            sep = "\n"
        )

1 个答案:

答案 0 :(得分:0)

jqueryize运行时,Test类不存在,data只是一个正常的函数。实现你想要的一种方法是使用两个装饰器 - 一个用于方法,它只是通过在函数上设置属性来标记要被jqueryized的方法,然后是一个类装饰器,它找到类中的所有标记方法,实际的转变。使这项工作的事实是类装饰器在创建类之后执行。

使用元类也可以获得相同的结果。这实现起来更加繁琐,但是你可以避免必须装饰每个具有装饰方法的类,只要它们子类化了重组的元类实例。