我有一个类似下面的课程
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
是一种好习惯吗?
答案 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
通常是正确的做法。 (有时,您可能希望返回新创建的对象。这取决于您是否希望链接方法是否累积修改原始对象。)