对于str.split(line)我在str类上调用一个方法,并将一个行对象(恰好是一个充满字符串的列表)传递给字符串对象?
我似乎更清楚我应该在我的线对象上调用split()方法。
我无法理解为什么两种方式都有效。
答案 0 :(得分:5)
首先,你是对的,在这种情况下,调用line.split()
比str.split(line)
更具可读性(更多Pythonic等)。
但有str.split
有用的情况吗?当然。想象一下,你有一个行列表,你想要拆分所有行。其中哪一个更具可读性:
split_lines = map(str.split, lines)
split_lines = map(lambda line: line.split(), lines)
由于str.split
已经是适用于任何str
的函数,因此您无需创建适用于任何str
传递的新函数。
更一般地说,你所问的是为什么Python有“非绑定方法”。*部分原因是因为它们自然地脱离了设计方法在Python中如何工作。**但主要是因为它们很方便传递给高阶函数(并且因为绝对一切都应该可以用作值,除非有充分的理由不允许它)。
至于最后一部分,了解它们是如何工作的,这可能与SO答案有点牵连。您可以了解它们如何工作的基础知识in the tutorial;有关详细信息,请参阅How methods work,其中包含指向其他有用信息的链接。但作为一个快速总结:
line.split
是一个绑定方法 - 一个可调用对象,它在以后调用它时知道要传递的值self
。因此,line.split()
只调用绑定方法而没有其他参数,line
会自动作为self
传递。str.split
是一种未绑定的方法 - 基本上只是一个函数。因此,str.split(line)
明确地将line
作为self
。*从3.x开始,术语“未绑定方法”被淡化,因为实际上,未绑定方法与函数相同。
** Guido已经解释了几次;从2009年的博客文章First-Class Everything开始。