【问题标题】:Why not use static methods for CBV's?为什么不对 CBV 使用静态方法?
【发布时间】:2016-09-23 02:38:32
【问题描述】:

Pycharm 建议我将 CBV 方法设为静态,我想“为什么不”。但是没有这样做是有原因的,否则很多比我聪明的人以前一定想过这样做。现在我试图理解为什么它没有完成。

我再次阅读了文档中的教程,唯一使用self 的地方是引用对象方法,它们本身可能是静态的。所以我仍然看不出有任何理由不应该将它们全部设为静态。

http://www.django-rest-framework.org/tutorial/3-class-based-views/

我尝试在我的项目中将它们设为静态,它似乎可以正常工作。那么有人可以向我解释为什么这些方法不作为一种常见的做法是静态的吗? FBV 是静态的,所以 CBV 也应该使用静态方法,对吧?

【问题讨论】:

    标签: django oop django-rest-framework


    【解决方案1】:

    它们不是静态的,因为使用视图实例更容易。通常,当您编写静态方法时,您只是将函数绑定到类/实例以便于使用。这个函数不知道实例本身。它在这里只是为了命名空间。

    但在 CBV 中,requestobject 等数据存储在 self 上,因此可以在任何实例方法中访问它,而无需通过所有方法调用链传递它们。不要忘记,有许多底层方法可用于处理表单、上下文、模板等。您可能需要共享“实例上下文”才能让它们执行您想要的操作。

    【讨论】:

    • 如果我理解正确的话,这是语法糖,如果需要也可以是静态的,对吗?这是否也适用于 Django Rest Framework 视图?我仍在寻找有效的用例,我只能找到一个混淆的示例,看起来他们使用实例变量是为了使用它们:docs.djangoproject.com/en/1.10/topics/class-based-views/intro/…
    • @DavidTan 你说的语法糖是什么意思?
    • @SardorbekImomaliev 我认为这个答案不正确。 requestdispatch 传递到映射视图中。我看不出有什么理由不用@staticmethod 来装饰。我认为更明确的是哪个更符合 Python 的哲学。
    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 2018-10-27
    • 2011-03-02
    • 2010-09-29
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多