在python中使用静态方法比使用实例方法的优势

2024-10-01 11:37:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:

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的建议而失去了什么,还是还有更多呢?在


Tags: 实例方法selfauthidobjrequestdef
2条回答

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

如果方法不属于类中,则可以将其移出类并使其成为标准函数。否则,如果它应该作为类的一部分绑定,例如,它是一个工厂函数,那么您可能应该使它成为一个静态方法,因为这(至少)可以作为有用的文档向类的用户说明该方法是耦合到类的,但不依赖于它的状态。在

使方法成为静态的还有一个优点,即可以在类的子类中重写它。如果方法作为常规函数移到类之外,那么子类化是不可能的。在

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

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

忽略它的可能原因:

  1. 代码是soon要更改为使用实例(另一方面,soon的想法是主观的,所以要小心)
  2. 代码是遗留的,不能完全理解/知道
  3. 该接口以多态/鸭子类型的方式使用(例如,你有一个对象的集合,你想用一种统一的方式调用它们,但是这个类中的实现碰巧不需要使用实例——这有点代码味道)
  4. 接口是外部指定的,不能更改(这与前面的原因类似)
  5. 代码的AST是由它本身或使用它的东西读取/操作的,它希望这个方法是一个实例方法(这也是接口的外部依赖)

我相信可以有更多的,但是如果没有这些原因,我会遵循这个建议。但是,如果方法不属于类(例如工厂方法或类似的方法),我会将它重构为不属于类的一部分。在

相关问题 更多 >