2 回答

TA贡献1788条经验 获得超4个赞
呃,确实误导了。
function
和
method
是两个不同的语境下的概念。function
是从代码机制角度来说的,表示函数这个机制,它是与“语句”相对应的概念。而
method
是从面向对象机制角度来说的,它表示类或对象的一个方法(也称操作),它是与“属性”等相对应的概念。
通常来说,function
与
method
是可以互换的。严格地说,虽然方法是由函数来实现的,但所有的函数并不一定是方法,例如:构造函数、析构函数、属性访问器等等都是由函数实现的,但它们都不是方法。有些私有函数的设计意图也是从面向过程来考虑的,并不是要提供一个
method。

TA贡献1911条经验 获得超7个赞
在Python中,对这两个东西有明确的规定:
函数function —— A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.
方法method —— A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).
从定义的角度上看,我们知道函数(function)就相当于一个数学公式,它理论上不与其它东西关系,它只需要相关的参数就可以。所以普通的在module中定义的称谓函数是很有道理的。
那么方法的意思就很明确了,它是与某个对象相互关联的,也就是说它的实现与某个对象有关联关系。这就是方法。虽然它的定义方式和函数是一样的。也就是说,在Class定义的函数就是方法。
从上面的角度看似乎很有道理。
>>> def fun():
pass
>>> type(fun)
<class 'function'> #没有问题
>>> class Cla():
def fun():
pass
@classmethod
def fun1(cls):
pass
@staticmethod
def fun2():
pass
>>> i=Cla()
>>> Cla.fun.__class__
<class 'function'> #为什么还是函数
>>> i.fun.__class__ #这个还像话
<class 'method'>
>>> type(Cla.fun1)
<class 'method'> #这里又是方法
>>> type(i.fun1)
<class 'method'> #这里仍然是方法
>>> type(Cla.fun2)
<class 'function'> #这里却是函数
>>> type(i.fun2)
<class 'function'> #这里却是函数
事实上,上面的结果是可以解释的:
1,普通方法(老版中直接就是"instancemethod")在module中与在Class中定义的普通函数,从其本身而言是没有什么区别的,他们都是对象函数属性。 之所以会被说在Class中的定义的函数被称为方法,是因为它本来就是面向将来的实例对象的,其实他们就是实例方法,这些方法是与实例相联系的(从实例出发访问该函数会自动赋值)。所以你从Class访问仍然是一个函数
2,类方法("classmethod"),因为类同样是对象,所以如果函数与类进行联系了话(与实例方法一样的模式)那么就能够这么说了!
3,静态方法,虽然定义在内部,并且也较方法,但是却不与任何对象联系,与从类访问方法是一样的,他们仍然是函数。
这样看来上面的定义可以改改了:
函数的定义自然不变。
方法的定义可以是这样的,与某个对象进行绑定使用的函数。注意哦。绑定不是指" . "这个符号,这个符号说实在的只有域名的作用。绑定在这里是指,会默认赋值该绑定的对象。
添加回答
举报