Python 里面的 函数 和 方法 怎么区分?

2012-06-07 17:04:19 +08:00
 mopig
之前以为都是一个意思,但好像不是那么回事~

求 高手 解释下,谢了~
15009 次点击
所在节点    Python
14 条回复
neildd
2012-06-07 17:05:54 +08:00
类里面定义的是方法,第一个参数是self,需要实例化类以后调用。
直接定义的是函数,可以在py文件的任何地方随意调用。
mopig
2012-06-07 17:08:16 +08:00
@neildd 就是说 函数 是针对类的,而 方法 是针对实例化 的对象的么?

JAVA中没有函数的概念,好像。。
neildd
2012-06-07 17:12:53 +08:00
你把c和java结合起来想一想
eric_q
2012-06-07 17:17:14 +08:00
class Foo()
def bar
a=Foo()
a.bar
mopig
2012-06-07 17:20:52 +08:00
@neildd 没学过C啊

@eric_q 这是方法,懂了; 但 函数呢?是 指静态方法么?
meteor
2012-06-08 10:32:32 +08:00
拿英文解释吧.
方法: method
函数: function
yuelang85
2012-06-08 10:41:11 +08:00
方法是一种特殊的函数。

python中,函数(方法)并不是依附与类才能存在。函数并不只是在类中定义。这种直接在模块中而不是类中定义的函数(方法),叫做函数。

而方法,是依附于类的,他们定义在类中,是属于类的,但是他们本质上,还是一个函数。方法的第一个参数不一定必须是self。

这么说吧,凡是def foo()这种,都是函数,在类中定义的函数,就是方法。
yuelang85
2012-06-08 10:41:43 +08:00
话说,java真是害死人,让人在各种概念中纠结。。。。
bayuwei2010
2012-06-08 10:43:38 +08:00
如果非要区分:在class 外面定义的叫函数,在class内部定义的叫做class的方法?
chonerlee
2012-06-08 10:44:45 +08:00
属于某个类的函数就是方法
不属于任何类的函数就是函数
adow
2012-06-08 10:46:08 +08:00
python里的实例方法是带了self作为第一个参数的“函数”,类方法是带了cls作为第一个参数的“函数”
yuelang85
2012-06-08 10:51:59 +08:00
>>> class A:
... def a(self):
... pass
... def b():
... pass
... @staticmethod
... def c():
... pass
... @classmethod
... def d():
... pass
...
>>> def f():
... pass
...


>>> type(A.a)
<type 'instancemethod'>


>>> type(A.b)
<type 'instancemethod'>


>>> type(A.c)
<type 'function'>


>>> type(A.d)
<type 'instancemethod'>


>>> type(f)
<type 'function'>


>>> dir(A.a)
['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'im_class', 'im_func', 'im_self']


>>> type(A.a.im_func)
<type 'function'>



别太纠结于概念,这种东西只有看官方文档的时候才用得上,有时候交流得时候,经常把这个两个说混,也没有造成过什么混淆。。。。
mopig
2012-06-08 12:08:00 +08:00
@yuelang85 谢谢 你这么详细的解答,基本了解了

其实实际应用中 是没必要纠结于概念的,但是作为菜鸟为了加强记忆,所以就有些纠结了
meteor
2012-06-08 15:21:20 +08:00
@mopig 其实这种题目最会在考试里出现了.
以前笔试,面试的时候,就遇到过类似问题.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/38692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX