【问题标题】:using python decorators with property inside of a class在类内部使用具有属性的python装饰器
【发布时间】:2014-03-04 03:30:04
【问题描述】:

我试图在一个类中使用属​​性和装饰器,但我一直遇到的问题是获取正确的参数和参数的数量。

class Xml(object):
    def __init__(self, data_dictionary=None):
        self.data_dictionary = data_dictionary

    def xml_wrapper(xml_msg):
        def wrap():
            return '<?xml version="1.0" encoding="UTF-8"?>\n'+xml_msg['name']
        return wrap


    @property
    @xml_wrapper
    def data_dictionary(self):
        return self._data_dictionary

    @data_dictionary.setter
    def data_dictionary(self, data):
        self._data_dictionary = data


if __name__ == '__main__':
    xml = Xml()
    xml.data_dictionary = {'name': 'name 1'}
    print xml.data_dictionary

我得到的错误是

 print xml.data_dictionary
TypeError: wrap() takes no arguments (1 given)

我不知道为什么,我尝试将 self 添加到 xml_wrapper 函数中,但仍然出现错误。

【问题讨论】:

  • data_dictionaryxml_wrapper 装饰器包装,它返回一个不带任何参数的函数(wrap);但是当您调用 xml.data_dictionary 时,正在传递隐式参数 xmlself)。

标签: python class properties decorator


【解决方案1】:

在您的代码中,xml_wrapper 是一个装饰器,它接受一个函数,然后用另一个函数 (wrap) 包装它并返回它。函数 wrap 不接受任何参数(如您的代码中所示)。但是当您调用xml.data_dictionary 时,python 会隐式传递导致问题的实例xml(称为self)。可能这就是你想要的:

>>> class Xml(object):
        def __init__(self, data_dictionary=None):
            self.data_dictionary = data_dictionary

        def xml_wrapper(f):
            def wrap(*k,**kw):
                xml_msg = f(*k,**kw)
                return '<?xml version="1.0" encoding="UTF-8"?>\n'+xml_msg['name']
            return wrap


        @property
        @xml_wrapper
        def data_dictionary(self):
            return self._data_dictionary

        @data_dictionary.setter
        def data_dictionary(self, data):
            self._data_dictionary = data


>>> xml = Xml()
>>> xml.data_dictionary = {"name":"name 1"}
>>> print xml.data_dictionary
<?xml version="1.0" encoding="UTF-8"?>
name 1

这一次 xml_wrapper 使用一个函数 (data_dictionary) 然后调用这个函数来获取 xml_msg(在 wrap 内)。 wrap 现在接受任意多个参数,然后将它们传递给原始函数 (data_dictionary),获取值、格式化并返回。

【讨论】:

  • 既然 xml_wrapper 不是类的一部分(意味着它没有 self 作为第一个参数),我应该将它放在类中还是将其作为独立函数? pythonic的方法是什么?
  • 我认为这是一个偏好问题。由于装饰器与self 无关,确实可以放在另一个模块中。但是,由于该类正在处理 Xml,因此将该装饰器放在该类中也是有意义的。我更喜欢后者。
猜你喜欢
  • 2018-08-16
  • 2016-09-02
  • 2020-10-07
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2016-07-30
  • 2016-09-11
  • 2012-12-08
相关资源
最近更新 更多