在课堂上回归自我 - 这是一个好方法吗?

时间:2014-03-22 20:42:10

标签: python class oop self

我有一个类似下面的课程

class TestClass(object):

    def __init__(self, data):
            self.data = data

    def method_a(self, data):
            self.data += data/2
            return self

    def method_b(self, data):
            self.data += data
            return self

    def method_c(self, data):
            self.data -= data
            return self

每个方法都返回self。我这样写就是为了在一个链中叫几个metohds,即。 object.method_a(10).method_b(12).method_c(11)。我被告知方法中的return self不会返回当前对象,但会创建新对象。它真的是如何运作的吗?在python方法中使用return self是一种好习惯吗?

3 个答案:

答案 0 :(得分:3)

  

它真的是如何运作的吗?

不,它不会创建新对象,它将返回相同的实例。您可以使用is关键字检查它,检查两个对象是否相同:

t = TestClass(3)
c = t.method_a(4)

print t is c
>>> True
  

在python方法中使用return self是一种好习惯吗?

是的,它通常用于允许链接。

答案 1 :(得分:2)

return self 创建新对象,您被告知错误。

如果要构建支持链接的API,则返回self是一种很好的做法。您可能为链接API构建新对象,但这也不是必需的。

有关SQLAlchemy库如何处理每次更改的新实例的链接,请参阅Python class method chaining。在变换链中的对象时创建新对象允许您重新使用部分变换作为应用了不同链式变换的几个新对象的起点。

答案 2 :(得分:2)

返回self不会创建新对象。

我确定有些人会告诉你链接方法很糟糕。我并不同意这一定是坏事。编写专为方法链接而设计的API是一种选择,如果您决定这样做,您需要确保一切都按照人们的预期运行。但如果您决定这样做,那么返回self通常是正确的做法。 (有时,您可能希望返回新创建的对象。这取决于您是否希望链接方法是否累积修改原始对象。)

相关问题