在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(这个是笔者自己的翻译: 链式调用).
例子:
1
2
3
4
5
6
7
8
9
|
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, 则上述代码会出错。
1
2
3
4
5
6
7
8
9
|
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返回的结果是什么呢?
1
2
3
4
5
6
7
8
9
|
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()))
|
输出结果为:
<class '__main__.Foo'>
可以发现,return self返回的是类的实例。
一个真实的例子:
sklearn模块中很多方法的返回结果为self, 比如大多数模型的fit()方法,例子如下:
1
2
3
4
5
6
7
|
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]
总结
以上所述是小编给大家介绍的Python中return self的用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:https://segmentfault.com/a/1190000015791934