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

时间:2014-11-04 19:54:56

标签: python string oop

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

我似乎更清楚我应该在我的线对象上调用split()方法。

我无法理解为什么两种方式都有效。

1 个答案:

答案 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开始。