从左到右依次计算每个方法。考虑:>>> s='HELLO'
>>> s.lower()
'hello'
>>> s='HELLO '
>>> s.lower()
'hello '
>>> s.lower().strip()
'hello'
>>> s.lower().strip().upper()
'HELLO'
>>> s.lower().strip().upper().replace('H', 'h')
'hELLO'
要求是链中左侧的对象必须具有右侧方法的可用性。通常这意味着对象是相似的类型——或者至少共享兼容的方法或一个可理解的转换。在
作为一个例子,考虑这个类:
^{pr2}$
注意,作为一种不可变类型,Foo的每个返回都是一个新对象(m1、m2的新Foo或新的float)。现在试试这些方法:>>> foo
4463545376: init
>>> foo.m1()
4463545304: init=>m1
^^^^ different object id
>>> foo
4463545376: init
^^^^ foo still the same because you need to assign it to change
现在分配:>>> foo=foo.m1().m2()
>>> foo
4464102576: init=>m1=>m2
现在使用m3(),它将是一个float;不再是Foo:>>> foo=foo.m1().m2().m3()
>>> foo
.25
现在一个float——不能再使用foo方法了:>>> foo.m1()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'float' object has no attribute 'm1'>>> foo.as_integer_ratio()
(1, 4)