python 的 @staticmethod和@classmethod和普通实例方法

参考文章:

https://www.cnblogs.com/taceywong/p/5813166.html

 

其实我只做了小小的一点改动,方便自己理解。

 

Python其实有3类方法:

  • 静态方法(staticmethod)
  • 类方法(classmethod)
  • 实例方法(instance method)

 

 

def foo(x):
    print (" foo %s" %x)

class A(object):
    def foo(self,x):
        print (" foo %s" %x)
    @classmethod
    def class_foo(cls,x):
        print (" class_foo %s" %x)
    @staticmethod
    def static_foo(x):
        print (" static_foo %s " %x)

a = A()
foo('foo')
a.foo('instance')
A.class_foo('class')   #a.class_foo('class')  类方法是给类用的,如果实例要用也行,就是比较奇怪
a.static_foo('static')

结果为:

 foo foo
 foo instance
 class_foo class
 static_foo static 

 

在示例代码中,先理解下函数里面的self和cls,这个self和cls是对实例或者类的绑定。

其中,self对应实例

           cls对应类

        1.对于在类外面定义的一般的函数,我们可以这么调用:foo(x),这个函数就是最常用的,它的工作和任何东西(类、实例)无关。

        2.对于实例方法,类的方法与普通的函数只有一个特别的区别——它们在定义时必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。而且语法规定,每次定义方法的时候(注意,不是使用时,而是定义时)都需要绑定这个实例,就是foo(self,x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)其实是foo(a,x))。

        3.对于类方法,和实例方法一样,也有一个额外的参数,叫做cls,只不过它传递的是类而不是实例,A.class_foo(x),即class_foo(A,x)

       注意,这里的self和cls可以替换别的参数,但是python的约定是这两个,尽量不要更改。

        4.对于静态方法,其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用时候需要使用a.static_foo(x)A.static_foo()来调用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值