如何区分对象方法,类方法和静态方法

class A(object):
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)

    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)

    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x

a=A()
a.foo(1)
a.class_foo(2)
a.static_foo(3)
print '--------'
A.class_foo(4)
A.static_foo(5)
print '--------'
print a.foo
print a.class_foo
print a.static_foo


executing foo(<__main__.A object at 0x106ad2190>,1)
executing class_foo(<class '__main__.A'>,2)
executing static_foo(3)
--------
executing class_foo(<class '__main__.A'>,4)
executing static_foo(5)
--------
<bound method A.foo of <__main__.A object at 0x106ad2190>>
<bound method type.class_foo of <class '__main__.A'>>
<function static_foo at 0x106ad1500>

解析

对象方法只能用类的实例对象调用,A.foo(1)会报错,对象方法默认将对象实体a传递给方法的第一个参数(self);
类方法默认传递给第一个参数的是类(class A),通常用变量cls表示,而不是self。类方法既可以用类名调用也可以用类的实例调用。

以上所说默认传递第一个参数,为什么呢?
a.foo 仅仅需要一个参数,是因为foo函数默认是绑定到a这个对象上的

print a.foo
<bound method A.foo of <__main__.A object at 0x106ad2190>>

a.class_foo 是A绑定到class_foo而不是 a;

最后剩下静态方法,说到底它就是一个方法.a.static_foo只是返回一个不带参数绑定的方法.static_foo和a.static_foo只需要一个参数.

print a.static_foo
<function static_foo at 0x106ad1500>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,819评论 0 9
  • 1/数独姑娘 数独姑娘曾是我的舍友,我们见证了彼此刚刚踏入职场的矜持与不知所措,我们小心翼翼的在彼此的成长轨迹上行...
    木棉简兮阅读 399评论 0 0
  • 昨天是烧钱的一天。早饭时,我看中一套教拼音的玩具,娃也喜欢,果断买了,240,管他呢,只要娃喜欢学就好。娃还说米卡...
    圈_圈_阅读 133评论 0 0