从返回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