Getter方法与只读属性



已经有类似的问题"何时以及如何在python中使用内置函数property()",但我认为这是一个不同的问题。

我有一个类需要一个方法来获得一些工作进度的计数器:

class Downloader():
def __init__(self, max_workers):
self.executor = ThreadPoolExecutor(max_workers)
@property
def unfinished_tasks_count(self):
return self.executor._work_queue.unfinished_tasks

我认为最好这样做:

class Downloader():
...
def get_unfinished_tasks_count(self):
return self.executor._work_queue.unfinished_tasks

因为当它是查看接口的属性时(不查看文档和/或源代码),它并不是明确的只读计算属性。当它是一个方法时,很明显它只是一个计算值的getter,而不是一个可以由API客户端设置的简单属性。

所以我的问题是:什么时候使用getter方法和只读属性?

属性的使用应该符合您的意图,并为您的同行提供合理的期望。

何时不使用属性:

  • 当它涉及可能需要非恒定时间的计算时。这将与访问属性是一件很快的事情的直觉背道而驰
  • 当它具有某种外部状态时,它会被访问该属性的其他人所改变。这样做会违背直觉,即两次访问属性会产生相同的结果。另一方面,当您需要两次方法调用的结果时,通常将其存储在局部变量中,从而避免在两次调用之间发生变化

何时使用属性:

  • 主要是当不使用属性成为负担时(语法上)
  • 当您需要实现一个特定的接口(duck-type),而没有其他方法可以实现时

像往常一样,这些问题的答案取决于品味,没有硬性规定。在许多情况下,这些指南可能对您很有用,但它们并没有消除应用常识的必要性。

最新更新