在Python中,some_string.lower()和str.lower(some_string)有什么区别?

9 投票
2 回答
4014 浏览
提问于 2025-04-16 18:05

我对Python中的内置方法有点困惑。
比如,some_string.lower()str.lower(some_string)这两者是什么?它们有什么不同呢?

2 个回答

3

第一个是绑定方法调用,第二个是未绑定方法调用。

想象一下你要写一个这样的函数:

class str:
    ...
    def lower(self):
        # And so on

第一个参数是自我(self)。如果你通过一个实例来使用这个方法(比如说 some_string.lower()),那么这个实例会自动作为第一个参数传给方法(也就是 self)。

但是,如果你是通过类来调用这个方法(也就是未绑定的方法),比如 str.lower(some_string),那么就没有实例可以自动传递作为第一个参数了。所以,这时候 some_string 就会被当作 self 来处理,之前在第一个情况下用实例做的事情,现在就用 some_string 来做。

其实,使用未绑定的版本并不是很必要,因为任何字符串都有一个 lower() 方法可以调用。更推荐的写法是使用 some_string.lower()

10

str 是 Python 中所有字符串的类名。str.lower 是它的一个方法。

当你在它的一个实例上调用 lower(比如 'ABC'.lower())时,你是在调用一个绑定方法,这个方法会自动把调用的对象作为第一个参数(通常叫 self)传进去。

如果你在类本身上调用 lower(也就是说你用 str.lower()),那么你是在调用一个未绑定方法,这个方法不会自动提供 self 参数。因此,你需要自己指定要操作的对象。

如果这些听起来很难理解,考虑一下方法是如何在类中定义的,这样会简单一些。假设我们创建一个非常简单的类,表示一个点(空间中的 X,Y 坐标),并且有一个 show() 方法来打印这个点。

class Point:
    """This is the constructor of Point"""
    def __init__(self, x, y):
        # Save arguments as field of our class instance (self)
        self.x = x
        self.y = y

    def show(self):
        print self.x, self.y

# We now create an instance of Point:
p = Point(1.0, 2.0)

# We now show p by calling a bound method
p.show()

注意,我们不需要指定 self 参数(所以 p.show() 是不带参数调用的)。实际上,之前的调用大致等同于这个:

Point.show(p)

它们并不完全相同,但这是一个更高级的话题。当它们不相等的最简单情况之一是,如果你在创建对象后改变了 p.show 的值,比如:

p.show = 4

现在,p.show() 甚至无法编译,因为 p.show 不再是一个函数,而是一个整数!不过,Point.show(p) 仍然保持不变,因为我们只是修改了类实例(p)中的 show 属性,而不是在类本身(Point)中。

撰写回答