9

我对 Python 中的内置方法感到困惑。例如,它们是什么some_string.lower()以及str.lower(some_string)它们有何不同?

4

2 回答 2

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)仍然不会改变,因为我们只修改了show类实例 ( p) 中的属性,而不是类本身 ( Point) 中的属性。

于 2011-05-21T16:51:17.640 回答
3

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

想想你将如何编写这样的方法:

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

第一个参数是self。如果您在实例中使用此方法(例如some_string.lower(),实例会自动作为第一个参数传递给方法(as self)。

但是,如果您从类中调用它(作为未绑定的方法),例如str.lower(some_string),则没有实例可以作为第一个参数自动传递。因此,取而代之的是,some_string作为 self 传递,并且在第一种情况下对实例所做的任何事情都将使用some_string.

但是,从来没有真正需要使用未绑定的版本,因为任何字符串都会有一个lower()您可以调用的方法。首选样式是使用some_string.lower().

于 2011-05-21T16:47:23.550 回答