Python中的method

什么是method?

function就是可以通过名字可以调用的一段代码,我们可以传参数进去,得到返回值。所有的参数都是明确的传递过去的。
method是function与对象的结合。我们调用一个方法的时候,有些参数是隐含的传递过去的。下文会详细介绍。

instancemethod

这告诉我们get_weight是一个没有被绑定方法,什么叫做未绑定呢?继续看下去。

未绑定的方法必须使用一个Human实例作为第一个参数来调用啊。那我们来试试

果然成功了,但是一般情况下我们习惯这么使用。

这两种方式的结果一模一样。我们看下官方文档是怎么解释这种现象的。

原来我们常用的调用方法(person.get_weight())是把调用的实例隐藏的作为一个参数self传递过去了, self 只是一个普通的参数名称,不是关键字。

我们看到get_weight被绑定在了 person 这个实例对象上。
总结下

  1. instance method 就是实例对象与函数的结合。
  2. 使用类调用,第一个参数明确的传递过去一个实例。
  3. 使用实例调用,调用的实例被作为第一个参数被隐含的传递过去。

classmethod

我们看到get_weight是一个绑定在 Human 这个类上的method。调用下看看

类和类的实例都能调用 get_weight 而且调用结果完全一样。
我们看到 weight 是属于 Human 类的属性,当然也是 Human 的实例的属性。那传递过去的参数 cls 是类还是实例呢?

我们看到传递过去的都是 Human 类,不是 Human 的实例,两种方式调用的结果没有任何区别。cls 只是一个普通的函数参数,调用时被隐含的传递过去。
总结起来

  1. classmethod 是类对象与函数的结合。
  2. 可以使用类和类的实例调用,但是都是将类作为隐含参数传递过去。
  3. 使用类来调用 classmethod 可以避免将类实例化的开销。

staticmethod

我们看到 add 在无论是类还是实例上都只是一个普通的函数,并没有绑定在任何一个特定的类或者实例上。可以使用类或者类的实例调用,并且没有任何隐含参数的传入。

add 在两个实例上也是同一个对象。instancemethod 就不一样了,每次都会创建一个新的 get_weight 对象。
总结下

  1. 当一个函数逻辑上属于一个类又不依赖与类的属性的时候,可以使用 staticmethod。
  2. 使用 staticmethod 可以避免每次使用的时都会创建一个对象的开销。
  3. staticmethod 可以使用类和类的实例调用。但是不依赖于类和类的实例的状态。
1 2 收藏 12 评论

关于作者:acmerfight

(新浪微博:@acmerfight)(我的:github)Python 菜鸟。 个人主页 · 我的文章 · 2

相关文章

可能感兴趣的话题



直接登录
最新评论
  • 真的很难懂

    • acmerfight   2013/12/25

      您好,请问哪里不明白,可以直接说出来,我会尽量的讲的明白。谢谢

  • warbean   2013/12/25

    那么staticmethod有什么用呢?感觉这样和普通的function没区别?只是用来把一系列函数包装到类里面么?

    • acmerfight   2013/12/25

      关于 staticmethod 真正用到的时候会很少,但是有一种情况就是,一个函数逻辑上属于这个类,而且这个函数在放在全局有没有什么其他的用途,放在类中成为staticmethod不是更好吗?

  • 感觉说得不是很明了,略难懂,可能是我水平不够吧

    • acmerfight   2013/12/25

      其实我感觉你应该具体的说出哪里不清楚,哪里没弄明白。只是笼统的说不清楚,没有人帮得了你。

  • nine   2013/12/25

    写的真够烂的,举的例子这么简陋,没有明确的对比说明mothed和@classmothed作用,看完整篇文章我只是知道method和@classmethod和@staticmethod这几个关键字而已,我还得去网上查它的作用和自己写一些例子来验证它的一些细节

  • staticmethod 里面写错了吧:

    In [6]: Human().add is Human().add
    Out[6]: True

    博主应该是想比较:
    Human.add is Human().add

  • ficapy   2014/03/14

    2.可以使用和类的实例调用,但是都是将类作为隐含参数传递过去。
    掉了个类>_<

跳到底部
返回顶部