类方法返回自身 - 这种做法好吗?
我有一个像下面这样的类
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是个好习惯吗?
是的,这样做通常是为了方便链式调用。