python中@staticmethod和@classmethod用法和解释

先来解释一下staticmethod和classmethod。直接一点来说,我们知道对于一个普通的类,我们要使用其中的函数的话,需要对类进行实例化,而一个类中,某个函数前面加上了staticmethod或者classmethod的话,那么这个函数就可以不通过实例化直接调用,什么意思呢?就是说有时候,我们需要把一些具有特定功能的函数放到一起,做成包导入Python程序,最好就是把他们放到一个类中,但是一个类每次我都要去实例化他,我觉得很麻烦,于是我在函数前面加上了@staticmethod,@classmethod,那么我下次用这个函数的功能的时候,可以直接用 类名.函数名 的形式了,这样是不是省心多了?

 

  • @staticmethod将函数转换成为一个静态方法,@classmethod将函数转换成为一个类方法。
  • @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
  • @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
  • 如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
  • @classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
  实例方法 类方法(classmethod) 静态方法(staticmethod)
定义方式 self作为第一个参数 cls作为第一个参数 无强制参数
绑定对象 类的实例
调用方式 只能通过类的实例调用 类对象或者类的实例均可调用 类对象或者类的实例均可调用

 

 

 

 

 

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date    : 2019-04-04 12:46:46
# @Author  : Your Name (you@example.org)
# @Link    : http://example.org
# @Version : $Id$


class Test:

    def __init__(self, u):
        self.u = u
        print("类的初始化方法")

    def fun1(a, c):
        print("fun1: I' am instancemethod {}".format(c))

    @staticmethod
    def fun2():
        print("fun2: I' am staticmethod")
        Test("fdsf").fun1("call1")

    @classmethod
    def fun3(cls):
        print("fun3: I'am classmethod")
        cls("ooo").fun1("这样调用")


Test("a").fun1("I' am args")
Test.fun2()
Test.fun3()

 参考:https://blog.csdn.net/ibelieve8013/article/details/83037996

posted @ 2020-03-25 10:44  cydit  阅读(1800)  评论(0编辑  收藏  举报