资讯专栏INFORMATION COLUMN

Python中return self的用法

acrazing / 2357人阅读

摘要:在中,有些开源项目中的方法返回结果为对于不熟悉这种用法的读者来说,这无疑使人困扰,本文的目的就是给出这种语法的一个解释,并且给出几个例子。

  在Python中,有些开源项目中的方法返回结果为self. 对于不熟悉这种用法的读者来说,这无疑使人困扰,本文的目的就是给出这种语法的一个解释,并且给出几个例子。

  在Python中,return self的作用为:(英语原文,笔者水平有限,暂不翻译)

Returning self from a method simply means that your method returns a reference to the instance object on which it was called. This can sometimes be seen in use with object oriented APIs that are designed as a fluent interface that encourages method cascading.

通俗的说法是, allow chaining(这个是笔者自己的翻译: 链式调用).

  例子:

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return self

f = Foo()
f.bar().bar().bar()
print(f.myattr)

输出结果为4.

把bar()方法改为返回return None, 则上述代码会出错。

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    return None

f = Foo()
f.bar().bar().bar()
print(f.myattr)

输出结果如下:

AttributeError: "NoneType" object has no attribute "bar"

  那么return self返回的结果是什么呢?

class Foo(object):

  def __init__(self):
    self.myattr = 0

  def bar(self):
    self.myattr += 1
    #return None
    return self

f = Foo()
print(type(f.bar()))

输出结果为:

可以发现,return self返回的是类的实例。

  一个真实的例子:

sklearn模块中很多方法的返回结果为self, 比如大多数模型的fit()方法,例子如下:

from sklearn.linear_model import LogisticRegression

X = [[0,0], [0,1], [1,0], [1,1]]
y = [0, 1, 1, 0]

clf = LogisticRegression()
# fit函数返回的结果就是self, 允许链式调用
t = clf.fit(X,y).predict([[0,2]])
print(t)

输出:

[0]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42076.html

相关文章

  • Python进阶:自定义对象实现切片功能

    摘要:以自定义字典为例仅作演示,不保证其它功能的完备性猫输出结果上例的关键点在于将字典的键值取出,并对键值的列表做切片处理,其妙处在于,不用担心索引越界和负数索引,将字典切片转换成了字典键值的切片,最终实现目的。 2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇。合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动。原系列的单篇...

    yangrd 评论0 收藏0
  • Python Mock入门

    摘要:准确的说,是中一个用于支持单元测试的库,它的主要功能是使用对象替代掉指定的对象,以达到模拟对象的行为。下面我们使用对象在单元测试中分别测试访问正常和访问不正常的情况。 Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西。准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代掉指定的Python...

    Winer 评论0 收藏0
  • Python yield用法浅析(stackoverflow)

    摘要:生成器生成器是迭代器,但是只能迭代一次,生成器不会将所有值存储在内存中,而是实时的生成这些值看上去除了用替换了原来的外,它们没什么不同。 这是stackoverflow上一个关于python中yield用法的帖子,这里翻译自投票最高的一个回答,原文链接 here 问题 Python中yield关键字的用途是什么?它有什么作用?例如,我试图理解以下代码 ¹: def _get_c...

    Loong_T 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<