类方法返回自身 - 这种做法好吗?

3 投票
3 回答
3064 浏览
提问于 2025-04-17 23:27

我有一个像下面这样的类

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

每个方法都返回自身。我这样写是为了能够链式调用几个方法,比如说 object.method_a(10).method_b(12).method_c(11)。有人告诉我,方法中的 return self 并不是返回当前对象,而是创建了一个新的对象。这真的是这样吗?在 Python 方法中使用 return self 是好习惯吗?

3 个回答

3

return self不会创建一个新对象,你听错了。

如果你想做一个支持链式调用的API,返回 self 是个不错的做法。你可能会想为链式API创建一个新对象,但这并不是必须的。

可以参考 Python类方法链式调用,看看SQLAlchemy库是如何处理每次变化时创建新实例的。链式调用时创建新对象可以让你在多个新对象中重复使用部分变换,作为不同链式变换的起点。

3

返回self并不会创建一个新对象。

有些人可能会说方法链不好,但我并不认为它一定不好。设计一个支持方法链的API是一种选择,如果你决定这么做,就需要确保一切都按人们的预期工作。不过,如果你选择使用方法链,那么返回self通常是个不错的做法。(有时候,你可能想返回一个新创建的对象,这取决于你是否希望链式调用的方法共同修改原来的对象。)

4

这真的是它的工作方式吗?

不,它不会创建一个新的对象,而是返回同一个实例。你可以用 is 这个关键词来检查两个对象是否是同一个:

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

print t is c
>>> True

在Python的方法中使用return self是个好习惯吗?

是的,这样做通常是为了方便链式调用。

撰写回答