在类中声明方法而不是函数有什么好处?

时间:2016-02-09 13:15:46

标签: python django

  1. 这是在Django项目中正常/正确的方式:

    在models.py

    class Reservation():
    
        def cancel_reservation(self):
             # ....
    
        @classmethod
        def get_client_reservations(cls):
    
  2. 我在公司代码库中找到的另一种方式:

    在models.py

    class Reservation():
        # There is no method here except __unicode__ 
    

    和manage_reservations.py

    def cancel_reservation(reservation):
        # ...
    
    def get_client_reservations():
        # ...
    
  3. 我希望有一份关于选择第一种方式而不是第二种方式的后果的详尽清单。

3 个答案:

答案 0 :(得分:3)

这是一种编码风格。 "对象"在OOP中,数据是方法。该对象具有保存数据和操作数据所需的一切。没有"权利"回答,更多的意见和风格。

所以你可以写:

r = Reservation.objects.get(pk=1)
r.get_client_reservation()

而不是:

from . import get_client_reservation
get_client_reservation(r)

但事实是,Python模块是一个非常好的解决方案,可以将事物保持在一起,并且比复杂的继承链更容易调试。

在django中,OOP是必不可少的,因为框架可以让您轻松地对组件进行子类化并仅自定义您需要的内容,如果没有对象,这很难做到。

如果您需要具有特定字段的特定表单,则可以将其编写为具有函数的简单模块。但是如果你需要一个通用的" Form"每个人都可以自定义(或模型,身份验证后端等),你需要OOP。

所以底线(恕我直言):如果预订位于金字塔的底部,数据和代码的结束行,没有太大的区别,更多的个人偏好。如果它在顶部并且你需要ReservationThis和ReservationThat,那么OOP会更好。

答案 1 :(得分:1)

这不是一个技术问题,但是尝试对该代码执行git blame,并查看谁编写了这些方法,并询问他们为什么选择这样做。通常,最好将方法保留在类上(出于多种原因) - 例如,能够执行dir(r)(其中r是保留)并查看r上的所有方法。可能有一个原因(除非我们看到代码,否则我们无法知道)

答案 2 :(得分:0)

如果一个方法与类有关,你应该在一个类中放置一个方法,例如,如果它需要一些类变量或者它在逻辑上属于类