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

Hir*_*hii 7 python methods built-in

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

Boa*_*niv 8

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()
Run Code Online (Sandbox Code Playgroud)

请注意,我们不必指定self参数(因此调用p.show()时没有参数).实际上,之前的调用或多或少与此相同:

Point.show(p)
Run Code Online (Sandbox Code Playgroud)

它们并不完全等同,但这是一个更高级的主题.如果在创建对象后更改p.show的值,则最简单的一种情况是,例如:

p.show = 4
Run Code Online (Sandbox Code Playgroud)

现在,p.show()甚至不会编译,因为p.show不再是一个函数,而是一个整数!但是,Point.show(p)仍然没有改变,因为我们只修改show了类instance(p)中的属性而不是类本身(Point).


Raf*_*ler 3

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

考虑一下如何编写这样的方法:

class str:
    ...
    def lower(self):
        # And so on
Run Code Online (Sandbox Code Playgroud)

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

但是,如果您从类中调用它(作为未绑定方法),例如str.lower(some_string),则没有实例可以自动作为第一个参数传递。因此,相反,some_string它会作为 self 传递,并且在第一种情况下对实例执行的任何操作都会通过some_string.

然而,实际上没有必要使用未绑定的版本,因为任何字符串都有一个lower()可以调用的方法。首选样式是使用some_string.lower().