已经有一个类似的问题,但我认为这是一个不同的问题。
我有一个类需要一个方法来获取一些工作进度的计数器:

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类型)并且没有其他方法来实现它时。
像往常一样,这些问题的答案取决于品味,没有硬性规定这些指导原则在很多情况下可能对你很有用,但它们并没有消除应用常识的必要性。

10-02 15:43
查看更多