Python中的“方法”是什么?

84 投票
9 回答
231652 浏览
提问于 2025-04-16 04:33

有没有人能用非常简单的语言给我解释一下,Python中的“方法”是什么?

问题是,在很多针对初学者的Python教程中,这个词的使用方式就好像初学者已经知道在Python中“方法”是什么意思一样。虽然我当然知道这个词的一般意思,但我对它在Python中的具体含义完全不清楚。所以,请告诉我“Python中的方法”到底是怎么回事。

如果能给我一些非常简单的示例代码,那就太好了,因为一图胜千言。

9 个回答

28

在Python中,方法就是一种函数,它是因为某个对象的类型而可以使用的。

举个例子,如果你创建了一个列表 my_list = [1, 2, 3],那么你可以对这个列表使用 append 方法,比如 my_list.append(4)。所有的列表都有 append 方法,因为它们就是列表。

再举个例子,如果你创建了一个字符串 my_string = 'some lowercase text',那么你可以对这个字符串使用 upper 方法,比如 my_string.upper(),这是因为它是一个Python字符串。

列表没有 upper 方法,而字符串没有 append 方法。这是为什么呢?因为方法只会在特定的对象上存在,如果这些方法是为该类型的对象明确定义的。Python的开发者们(到目前为止)认为这些特定的对象不需要这些方法。

调用一个方法的格式是 object_name.method_name(),方法的参数放在括号里。这个方法会自动作用于你提到的对象,因此有些方法没有列出任何参数,因为对象本身就是唯一需要的参数。例如,my_string.upper() 没有列出任何参数,因为唯一需要的参数就是这个对象本身 my_string

一个常见的困惑点是:

import math
math.sqrt(81)

那么 sqrtmath 对象的方法吗? 不是。 这是你如何从 math 模块调用 sqrt 函数。使用的格式是 module_name.function_name(),而不是 object_name.method_name()。一般来说,区分这两种格式的唯一方法就是查看代码的其他部分,看看在句点之前的部分(mathmy_listmy_string)是定义为对象还是模块。

47

方法就是一种函数,它的第一个参数是类的实例。方法是类的成员。

class C:
    def method(self, possibly, other, arguments):
        pass # do something here

如果你想知道在Python中这具体是什么意思,可以区分绑定方法和未绑定方法。在Python中,所有的函数(包括方法)都是对象,可以被传递和“玩弄”。所以,绑定方法和未绑定方法的区别在于:

1) 绑定方法

# Create an instance of C and call method()
instance = C()

print instance.method # prints '<bound method C.method of <__main__.C instance at 0x00FC50F8>>'
instance.method(1, 2, 3) # normal method call

f = instance.method
f(1, 2, 3) # method call without using the variable 'instance' explicitly

绑定方法是属于类实例的方法。在这个例子中,instance.method 是绑定到名为 instance 的实例上的。每次调用这个绑定方法时,实例会自动作为第一个参数传入,这个参数通常被称为 self

2) 未绑定方法

print C.method # prints '<unbound method C.method>'
instance = C()
C.method(instance, 1, 2, 3) # this call is the same as...
f = C.method
f(instance, 1, 2, 3) # ..this one...

instance.method(1, 2, 3) # and the same as calling the bound method as you would usually do

当你访问 C.method(类里面的方法,而不是实例里面的方法)时,你得到的是一个未绑定方法。如果你想调用它,你必须把实例作为第一个参数传入,因为这个方法并没有绑定到任何实例上。

了解了这个区别后,你就可以把函数/方法当作对象来使用,比如传递方法。举个例子,想象一个API让你定义一个回调函数,但你想提供一个方法作为回调函数。没问题,只需传入 self.myCallbackMethod 作为回调,它会自动用实例作为第一个参数调用。这在像C++这样的静态语言中是做不到的(或者只能用一些技巧)。

希望你明白这个要点 ;) 我觉得这就是你需要知道的关于方法的基础知识。你也可以了解一下 classmethodstaticmethod 装饰器,但那是另一个话题。

95

这是一个属于某个类的函数:

class C:
    def my_method(self):
        print("I am a C")

c = C()
c.my_method()  # Prints("I am a C")

就是这么简单!

(还有一些其他类型的方法,可以让你控制类和函数之间的关系。不过我猜从你的问题来看,你并不是在问这些,而只是想了解基本的内容。)

撰写回答