Python中的“方法”是什么?
有没有人能用非常简单的语言给我解释一下,Python中的“方法”是什么?
问题是,在很多针对初学者的Python教程中,这个词的使用方式就好像初学者已经知道在Python中“方法”是什么意思一样。虽然我当然知道这个词的一般意思,但我对它在Python中的具体含义完全不清楚。所以,请告诉我“Python中的方法”到底是怎么回事。
如果能给我一些非常简单的示例代码,那就太好了,因为一图胜千言。
9 个回答
在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)
那么 sqrt
是 math
对象的方法吗? 不是。 这是你如何从 math
模块调用 sqrt
函数。使用的格式是 module_name.function_name()
,而不是 object_name.method_name()
。一般来说,区分这两种格式的唯一方法就是查看代码的其他部分,看看在句点之前的部分(math
、my_list
、my_string
)是定义为对象还是模块。
方法就是一种函数,它的第一个参数是类的实例。方法是类的成员。
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++这样的静态语言中是做不到的(或者只能用一些技巧)。
希望你明白这个要点 ;) 我觉得这就是你需要知道的关于方法的基础知识。你也可以了解一下 classmethod
和 staticmethod
装饰器,但那是另一个话题。
这是一个属于某个类的函数:
class C:
def my_method(self):
print("I am a C")
c = C()
c.my_method() # Prints("I am a C")
就是这么简单!
(还有一些其他类型的方法,可以让你控制类和函数之间的关系。不过我猜从你的问题来看,你并不是在问这些,而只是想了解基本的内容。)