V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
mopig
V2EX  ›  Python

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

  •  
  •   mopig ·
    mopig · 2012-06-07 17:04:19 +08:00 · 15004 次点击
    这是一个创建于 4543 天前的主题,其中的信息可能已经有所发展或是发生改变。
    之前以为都是一个意思,但好像不是那么回事~

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

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

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

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

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

    这么说吧,凡是def foo()这种,都是函数,在类中定义的函数,就是方法。
    yuelang85
        8
    yuelang85  
       2012-06-08 10:41:43 +08:00
    话说,java真是害死人,让人在各种概念中纠结。。。。
    bayuwei2010
        9
    bayuwei2010  
       2012-06-08 10:43:38 +08:00
    如果非要区分:在class 外面定义的叫函数,在class内部定义的叫做class的方法?
    chonerlee
        10
    chonerlee  
       2012-06-08 10:44:45 +08:00   ❤️ 1
    属于某个类的函数就是方法
    不属于任何类的函数就是函数
    adow
        11
    adow  
       2012-06-08 10:46:08 +08:00   ❤️ 1
    python里的实例方法是带了self作为第一个参数的“函数”,类方法是带了cls作为第一个参数的“函数”
    yuelang85
        12
    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
        13
    mopig  
    OP
       2012-06-08 12:08:00 +08:00
    @yuelang85 谢谢 你这么详细的解答,基本了解了

    其实实际应用中 是没必要纠结于概念的,但是作为菜鸟为了加强记忆,所以就有些纠结了
    meteor
        14
    meteor  
       2012-06-08 15:21:20 +08:00
    @mopig 其实这种题目最会在考试里出现了.
    以前笔试,面试的时候,就遇到过类似问题.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:15 · PVG 06:15 · LAX 14:15 · JFK 17:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.