【问题标题】:Return self in class method - is this good approach?在课堂方法中返回自我 - 这是好方法吗?
【发布时间】:2014-03-22 20:42:09
【问题描述】:

我有一个像下面这样的课程

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 in 方法不会返回当前对象,而是创建新对象。真的是这样吗?在 python 方法中使用return self 是一种好习惯吗?

【问题讨论】:

  • return self 创建一个新对象,你被告知错了。

标签: python class oop self


【解决方案1】:

真的是这样吗?

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

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

print t is c
>>> True

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

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

【讨论】:

    【解决方案2】:

    返回 self 不会创建新对象。

    我相信有些人会告诉你方法链是不好的。我不同意它一定是坏的。编写一个为方法链设计的 API 是一种选择,如果你决定这样做,你需要确保一切都按人们期望的那样工作。但是,如果您决定这样做,那么返回 self 通常是正确的做法。 (有时,您可能希望返回一个新创建的对象,这取决于您是否希望链式方法累积修改原始对象。)

    【讨论】:

      【解决方案3】:

      return self创建一个新对象,你被告知错了。

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

      请参阅Python class method chaining,了解 SQLAlchemy 库如何处理每次更改与新实例的链接。在对链中的对象进行变异时创建一个新对象,您可以将部分转换作为应用了不同链式转换的多个新对象的起点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-03
        • 2015-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多