在python中使用静态方法优于实例方法的优点

时间:2015-01-23 11:23:46

标签: python methods

我的IDE一直建议我将我的实例方法转换为静态方法。我猜是因为我没有在这些方法中引用任何自我。

一个例子是:

class NotificationViewSet(NSViewSet):

    def pre_create_processing(self, request, obj):
        log.debug(" creating messages ")

        # Ensure data is consistent and belongs to the sending bot.
        obj['user_id'] = request.auth.owner.id
        obj['bot_id'] = request.auth.id

所以我的问题是:我只是忽略了IDE的建议而失去了什么,还是有更多的建议呢?

2 个答案:

答案 0 :(得分:2)

这是工作流程,你的设计意图,也是一个有点主观的决定。

首先,你是对的,你的IDE建议将方法转换为静态方法,因为该方法不使用实例。 遵循此建议最有可能是一个好主意,但您可能有几个理由忽略它。

忽略它的可能原因:

  1. 代码很快被更改为使用实例(另一方面,很快的想法是主观的,所以要小心)
  2. 代码是遗留的,并不完全理解/已知
  3. 接口以多态/ duck类型的方式使用(例如,您有一个使用此方法的对象集合,并且您希望以统一的方式调用它们,但此类中的实现恰好不需要使用该实例 - 这有点代码味道)
  4. 接口在外部指定,无法更改(这与上一个原因类似)
  5. 代码的AST由其自身或使用它的东西读取/操作,并期望此方法是一个实例方法(这又是对接口的外部依赖)
  6. 我确信可以有更多,但如果没有这些原因我会遵循这个建议。但是,如果该方法不属于该类(例如工厂方法或类似的东西),我会重构以使其不属于类。

答案 1 :(得分:1)

我认为你可能会混淆一些术语 - 例子不是class method。类方法接收类作为第一个参数,它们不接收实例。在这种情况下,您有一个不使用其实例的普通实例方法。

如果该方法不属于该类,则可以将其移出该类并使其成为标准函数。否则,如果它应该捆绑为类的一部分,例如它是一个工厂函数,那么你应该把它变成一个静态的方法,因为这个(至少)作为你班级用户的有用文档,该方法与课程相结合,但不依赖于它。国家。

使方法静态也具有优势,可以在类的子类中重写它。如果方法作为常规函数移出类之外,则无法进行子类化。