Python中方法内部的方法

2024-04-16 17:07:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过在一个对象上调用多个方法的源代码,比如x.y().z()有人能给我解释一下吗,这是不是意味着z()在{}内部还是什么?在


Tags: 对象方法源代码
3条回答

从左到右依次计算每个方法。考虑:

>>> 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 "<stdin>", line 1, in <module>
AttributeError: 'float' object has no attribute 'm1'

但您可以使用float methods

>>> foo.as_integer_ratio()
(1, 4)

在下列情况下:

x.y().z()

你几乎总是在看不可变的对象。可变对象不会返回任何具有类似函数的内容(在大多数情况下,我正在简化)。例如。。。在

^{pr2}$

您可以看到x.yx.z中的每一个都返回一个x对象。该对象用于进行连续调用,例如在x.y().z()中,x.z不在x上调用,而是在{}上调用。在

x.y().z() =>
    tmp = x.y()
    result = tmp.z()

在@dawg的优秀示例中,他使用了字符串(在Python中是不可变的),其方法返回字符串。在

string = 'hello'
string.upper() # returns a NEW string with value "HELLO"
string.upper().replace("E","O") # returns a NEW string that's based off "HELLO"
string.upper().replace("E","O") + "W"
# "HOLLOW"

这将对对象x调用方法y(),然后对{}的结果调用方法z(),整行是方法z()的结果。在

例如

friendsFavePizzaToping = person.getBestFriend().getFavoritePizzaTopping()

这将导致friendsFavePizzaTopping将是此人最好的朋友最喜欢的比萨配料。在

需要注意的是:getBestFriend()必须返回一个方法为getFavoritePizzaTopping()的对象。否则,将抛出一个AttributeError。在

相关问题 更多 >