從返回self
方法僅僅意味着你的方法返回一個對它被調用的實例對象的引用。有時候可以看到這種方法在面向對象的API中使用,這些API設計爲fluent interface,鼓勵method cascading。因此,例如,
>>> class Counter(object):
... def __init__(self, start=1):
... self.val = start
... def increment(self):
... self.val += 1
... return self
... def decrement(self):
... self.val -= 1
... return self
...
>>> c = Counter()
現在我們可以使用方法級聯:
>>> c.increment().increment().decrement()
<__main__.Counter object at 0x1020c1390>
通知,decrement()
上一次調用返回<__main__.Counter object at 0x1020c1390>
,這是self
。 現在:
>>> c.val
2
>>>
注意,你不能做到這一點,如果你沒有返回self
:
>>> class Counter(object):
... def __init__(self, start=1):
... self.val = start
... def increment(self):
... self.val += 1
... # implicitely return `None`
... def decrement(self):
... self.val -= 1
... # implicitely return `None`
...
>>> c = Counter()
>>> c.increment().increment()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'increment'
>>> c
<__main__.Counter object at 0x1020c15f8>
>>> c.val
2
>>>
注意,不是每個人都的「方法級聯」設計的散熱風扇。 Python的內置插件不傾向於例如做到這一點,所以,list
:
>>> x = list()
>>> x.append(1).append(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'append'
>>>
的一個地方,你做經常看到這是當你的類實現了iterator
協議,在一個迭代器,其中iter
通過返回self
約定,雖然這是由the docs建議:
在看到迭代器協議背後的機制,很容易 添加迭代器行爲的類。定義一個__iter__()
方法 ,該方法返回帶有__next__()
方法的對象。如果類 定義__next__()
,然後__iter__()
可以只返回self
:
class Reverse:
"""Iterator for looping over a sequence backwards."""
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
通知,這實際上使你的迭代器只對單次有用:
>>> x = [1, 2, 3, 4]
>>> it = iter(x)
>>> list(it)
[1, 2, 3, 4]
>>> list(it)
[]
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
定義好處? –
[文檔中的'__iter__'](https://docs.python.org/3/reference/datamodel.html#object.__iter__)。你可以開始閱讀。簡短回答:'__iter__'返回'self',因爲它需要迭代器。 – Matthias
@艾略特羅伯茨什麼是使用? – AmrElgendy