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

bam*_*222 2 python oop string

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

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

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

aba*_*ert 5

首先,你是对的,在这种情况下,它更可读(和更多Pythonic等)只是打电话line.split()str.split(line).

但有什么案例str.split有用吗?当然.想象一下,你有一个行列表,你想要拆分所有行.以下哪一项更具可读性:

split_lines = map(str.split, lines)
split_lines = map(lambda line: line.split(), lines)
Run Code Online (Sandbox Code Playgroud)

因为str.split已经是一个适用于任何函数的函数str,所以你不必创建一个适用于任何str传递的新函数.


更一般地说,你所问的是为什么Python有"非绑定方法".*部分原因是因为它们自然不属于Python中方法的工作方式.**但主要是因为它们很方便传递更高阶函数(并且因为绝对一切都应该可用作值,除非有充分的理由不允许它).


至于最后一部分,了解它们是如何工作的,这可能与SO答案有点牵连.您可以在本教程中学习它们的工作原理; 有关更多详细信息,请参阅方法如何工作,其中包含指向其他有用信息的链接 但作为一个快速总结:

  • line.split是一个绑定方法 - 一个可调用对象,self它在以后调用它时知道要传递的值.因此,line.split()只需调用绑定方法而不添加其他参数,并line自动将其作为传递方式传递self.
  • str.split是一种未绑定的方法 - 基本上只是一个函数.因此,str.split(line)明确地传递lineself.

*从3.x开始,术语"未绑定方法"被淡化,因为实际上,未绑定方法与函数相同.

**Guido已经解释了几次; 从他2009年的博客文章First-Class Everything开始.