# 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
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
在Python中,方法是对给定对象可用的函数,因为对象的类型是。
例如,如果创建
my_list = [1, 2, 3]
,则append
方法可以应用于my_list
,因为它是一个Python列表:my_list.append(4)
。所有列表都有一个append
方法,因为它们都是列表。另一个例子是,如果创建
my_string = 'some lowercase text'
,那么upper
方法可以应用于my_string
,因为它是一个Python字符串:my_string.upper()
。列表没有
upper
方法,字符串也没有append
方法。为什么?因为方法只存在于为特定对象类型显式定义的特定对象中,而Python的开发人员(到目前为止)已经决定这些特定对象不需要这些特定方法。要调用方法,格式为
object_name.method_name()
,该方法的任何参数都列在括号中。该方法隐式地作用于被命名的对象,因此有些方法没有任何声明的参数,因为对象本身是唯一必需的参数。例如,my_string.upper()
没有任何列出的参数,因为唯一需要的参数是对象本身,my_string
。一个常见的混淆点是:
sqrt
是math
对象的方法吗?不。这就是从math
模块调用sqrt
函数的方式。使用的格式是module_name.function_name()
,而不是object_name.method_name()
。一般来说,区分这两种格式的唯一方法(可视化的)是查看代码的其余部分,看看在句点(math
,my_list
,my_string
)之前的部分是否定义为对象或模块。方法是以类实例作为其第一个参数的函数。方法是类的成员。
因为您想知道它在Python中的具体含义,所以可以区分绑定方法和未绑定方法。在Python中,所有函数(以及方法)都是可以传递和“播放”的对象。因此,unbound方法和bound方法的区别是:
1)绑定方法
绑定方法是属于类实例的方法。在本例中,
instance.method
绑定到名为instance
的实例。每次调用绑定方法时,都会自动将实例作为第一个参数传递,按照惯例称为self
。2)解除绑定的方法
当您访问
C.method
(类中的方法而不是实例中的方法)时,会得到一个未绑定的方法。如果要调用它,则必须将实例作为第一个参数传递,因为该方法绑定到任何实例时都是而不是。知道这一区别后,您可以将函数/方法用作对象,就像传递方法一样。作为一个示例用例,假设一个API允许您定义回调函数,但是您希望提供一个方法作为回调函数。没问题,只要把
self.myCallbackMethod
作为回调传递,它就会自动被调用,实例作为第一个参数。在C++等静态语言中(或者只使用欺骗),这是不可能的。希望你明白我的意思;)我想这就是你应该知道的方法基础知识。您还可以阅读更多关于
classmethod
和staticmethod
装饰器的内容,但这是另一个主题。它是一个类的成员函数:
就这么简单!
(还有一些其他类型的方法,允许您控制类和函数之间的关系。但我从你的问题中猜到,你不是在问这个问题,而是在问基本问题。)
相关问题 更多 >
编程相关推荐