zoukankan      html  css  js  c++  java
  • python中@staticmethod与@classmethod

    @

      首先这里介绍一下‘@’的作用,‘@’用作函数的修饰符,是python2.4新增的功能,修饰符必须出现在函数定义前一行,不允许和函数定义在同一行。只可以对模块或者类定义的函数进行修饰,不允许修饰一个类。一个修饰也就是一个函数,它将被修饰的函数作为参数,并返回修饰后同名函数的调用。

    #-*- coding:utf-8 -×-
    
    def fun(f):
        print 'AAAA'
        return f('BBBB')
    
    @fun
    def fun_1(s):
        print s
    
    def fun_2(s):
        print s
    fun(fun_2)

    输出:

    AAAA
    BBBB
    AAAA
    BBBB

    @staticmethod和@classmethod

      python其实有3个方法,静态方法、类方法和实例方法如下:

    #-*- coding:utf-8 -*-
    def fun(x):
        print "fun for %s"%x
    
    class A(object):
        def fun(self,x):
            print "fun for (%s,%s)"%(self,x)
    
        @classmethod
        def class_fun(cls,x):
            print "fun for (%s,%s)" % (cls, x)
    
        @staticmethod
        def static_fun(x):
            print "fun for %s" % x
    
    fun(1)
    a
    =A() a.fun(1) a.class_fun(1) a.static_fun(1) A().fun(1) #A.fun(1)是非法的 A.class_fun(1) A.static_fun(1)

    输出:

    fun for 1
    fun for (<__main__.A object at 0x7f40fd9c5ed0>,1)
    fun for (<class '__main__.A'>,1)
    fun for 1
    fun for (<__main__.A object at 0x7f40fd9d4150>,1)
    fun for (<class '__main__.A'>,1)
    fun for 1

      这里先理解一下参数中的self和cls,这里的self和cls是对类或者实例的绑定。对于一般的函数来说我们可以直接调用,例如fun(1)’,这也是最常见的,它的工作和任何的类、实例没有关系,但类里面定义的方法都需要绑定这个实例,比如fun(self,x)’,之所以这样做,是因为实例方法的调用离不开实例,我们需要把实例自己传给参数,调用的时候比如‘a.fun(1)’(其实是fun(a,1)),类的方法也是一样的,只不过它传递的是类而不是实例,比如‘A.class_fun(1)’,注意这里的self和cls可以换成别的参数,但是python约定就是这样。

      实例方法  类方法  静态方法

      a=A()       a.fun(x)  a.class_fun(x

      A              不可用      A.class_fun

  • 相关阅读:
    HDU
    HDU
    HDU
    2016蓝桥杯省赛C/C++A组第二题 跳蚱蜢
    2016蓝桥杯决赛C/C++A组第四题 路径之谜
    【洛谷P2397】yyy loves Maths VI (mode)【模拟】
    【洛谷P2397】yyy loves Maths VI (mode)【模拟】
    【NOIP2018】【洛谷P5017】摆渡车【DP】
    【NOIP2018】【洛谷P5017】摆渡车【DP】
    2018NOIP普及组 划水记
  • 原文地址:https://www.cnblogs.com/ybf-yyj/p/9025409.html
Copyright © 2011-2022 走看看