【问题标题】:Redundant Function Call for Decorators in PythonPython中装饰器的冗余函数调用
【发布时间】:2020-03-19 23:29:54
【问题描述】:

所以我正在查看具有以下属性功能的某个类。但是,属性方法本身并没有描述过程,而是调用另一个函数来这样做:

class Foo():

 @property
 def params(self):
     return self._params()

 @property
 def target(self):
     return self._target()

 def _params(self):
     return print("hello")
 def _target(self):
     return print("world")

如果它是某种模式,我想了解什么?我在另一个类中也看到过类似的事情,其中​​带有属性装饰器的方法只是简单地调用另一个同名的方法,开头带有下划线。 注意:我确实知道什么是属性装饰器,但不明白为什么这种特定的下划线方式旨在实现。

【问题讨论】:

  • @hazirovich 我不确定你是否理解这个问题。
  • 我有时会使用它,例如 _params 需要一些参数。我将其称为params,该属性将是默认参数调用的快捷方式。
  • @CedricH。这样做的原因是什么,为什么不简单地使用 params 而不是创建另一个函数 _params 因为 params 已经声明为属性?
  • @GENIVI-LEARNER 像这样:创建一个带有默认值参数的函数get_information,然后创建一个属性information,它使用默认参数集调用get_information。这样,在某些情况下,类的用户可以使用快捷方式并获得更好的外观和感觉。在您的具体情况下,有_params_target 不带参数,我看不到重点。

标签: python design-patterns decorator python-decorators


【解决方案1】:

实际上,该属性被用作调用具有一组固定参数的方法的快捷方式。作为一个稍微不同的例子,考虑

class Foo():

    @property
    def params(self):
        return self._params(1, "foo", True)

    def _params(self, x, y, z):
        ...

f = Foo()

现在,f.paramsf._params(1, "foo", True) 的快捷方式。这是否值得做取决于_params 是否用于实现params getter 的主体之外的任何其他。如果不是,那么编写这样的代码就没有什么意义了。

【讨论】:

  • 我基本上明白了,而不是写f._params(1, "foo", True),我们可以简单地做一个快捷方式,比如f.params,而不必指定额外的参数。对吗?
  • 您能否详细说明一下:_params 用于实现 params getter 主体以外的任何内容
  • 如果定义_params的唯一目的是让您可以从params的主体中调用它一次,那么您可能应该直接将其代码放入params而不定义@首先是 987654332@。这样可以节省不必要的函数调用。
猜你喜欢
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 2017-01-15
  • 2017-08-01
  • 2023-02-08
  • 2018-03-07
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多