繁体   English   中英

为什么在line.split()上写str.split(line)有意义?

[英]Why does it make sense to write str.split(line) over line.split()?

对于str.split(line),我正在str类上调用一个方法,并将一个恰好是字符串列表的line对象传递给string对象?

对我来说似乎更清楚了,我应该只在行对象上调用split()方法。

我无法理解为什么两种方法都起作用。

首先,您是对的,在这种情况下,仅调用line.split()str.split(line)更具可读性(和更多Pythonic等str.split(line)

但是在任何情况下str.split都有用吗? 当然。 想象一下,您有一个行列表,并且想要拆分所有行。 以下哪个更易读:

split_lines = map(str.split, lines)
split_lines = map(lambda line: line.split(), lines)

因为str.split已经是可以在任何str上运行的函数,所以您不必创建可以在任何str上运行的新函数。


更笼统地说,您要问的是Python为什么具有“未绑定方法”。*部分是因为它们自然而然地脱离了方法在Python中的工作方式。**但主要是因为它们在传递时很方便到高阶函数(并且因为这样的想法:除非有充分的理由不允许,否则绝对所有东西都可以作为值使用)。


至于最后一部分,了解它们两者的工作原理,可能需要一点SO答案。 您可以在本教程中学习它们的工作原理; 有关更多详细信息,请参阅方法的工作原理 ,该方法具有指向其他有用信息的链接。 但快速总结一下:

  • line.split是一个绑定方法,它是一个可调用的对象,该对象知道以后要调用什么参数作为self参数。 因此, line.split()仅调用该绑定方法而没有其他参数,并且line自动作为self传递。
  • str.split是一个未绑定的方法,基本上只是一个函数。 因此, str.split(line)显式地将line作为self传递。

*从3.x版本开始,术语“未绑定方法”已被淡化,因为实际上,未绑定方法与函数是同一回事。

** Guido对此做了几次解释; 从他2009年的博客文章First-Class Everything开始

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM