使用@property装饰器时获取属性名称

时间:2019-08-14 14:29:31

标签: python python-3.x python-decorators

让我们来看看这段代码。

class property_name(object):
    def __init__(self, function):
        self.property_name = function.__name__
        self.function = function

    def __call__(self, *args, **kwargs):
        self.function(self)

class Test:

    def __init__(self):
        pass

    # @property
    @property_name
    def temperature(self):
        print(self.property_name)
        return 24.5

    # @property
    @property_name
    def time(self):
        print(self.property_name)
        return "12:45 am"

if __name__ == '__main__':
    t = Test()
    print(t.temperature)
    print(t.time)

现在,到目前为止,我知道,属性装饰器尚无法以temperaturetime之类的字符串来获取属性名称。

因此,我决定尝试通过编写装饰器property_name来获取函数名称。使用此装饰器装饰功能完全可以满足我的需求。装饰器将属性property_name添加到带有已调用函数名称的类中。到目前为止,一切正常并且很清楚。

但是,当我链接property装饰器时,就会遇到麻烦:

Traceback (most recent call last):
  File "test_func_name.py", line 28, in <module>
    t.temperature()
TypeError: 'NoneType' object is not callable

调试代码,我发现方法temperaturetime都是None

如何将装饰器链接到property?对于这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

您必须返回在driverService.HideCommandPromptWindow = true; 中调用的函数的值:

property_name.__call__

然后

class property_name(object):
    def __init__(self, function):
        self.property_name = function.__name__
        self.function = function

    def __call__(self, *args, **kwargs):
        return self.function(self)