@staticmethod和classmethod

Posted yqpy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@staticmethod和classmethod相关的知识,希望对你有一定的参考价值。

之前一直搞不清楚这两个类方法有什么区别,今天着重学习了一下

@staticmethod是静态方法,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。

class C(object):
    @staticmethod
    def f():
        print(runoob);
 
C.f();          # 静态方法无需实例化
cobj = C()
cobj.f()        # 也可以实例化后调用

classmethod是类方法,对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

class A(object):
    bar = 1
    def func1(self):  
        print (foo) 
    @classmethod
    def func2(cls):
        print (func2)
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

再举一个例子,如果一个类定义了日期,需要输出年月日,然而有时候输入的格式是“年-月-日”的形式,又需要先把这种格式转化为年月日,再输出,这时候就需要一个方法去改变类的输入值,而不是去改变init初始化函数,这个方法就是类方法或静态方法,详见如下

class Data_test2(object):
    day=0
    month=0
    year=0
    def __init__(self,year=0,month=0,day=0):
        self.day=day
        self.month=month
        self.year=year

    @staticmethod ###静态方法
    def get_date(data_as_string):
        year,month,day=map(int,data_as_string.split(-))
        date1=Data_test2(year,month,day)
        #返回的是一个初始化后的类
        return date1

    def out_date(self):
        print("year :")
        print(self.year)
        print("month :")
        print(self.month)
        print("day :")
        print(self.day)
r=Data_test2.get_date("2016-8-6")
r.out_date()
class Data_test2(object):
    day=0
    month=0
    year=0
    def __init__(self,year=0,month=0,day=0):
        self.day=day
        self.month=month
        self.year=year

    @classmethod  ###类方法
    def get_date(cla, data_as_string):
        #这里第一个参数是cls, 表示调用当前的类名
        year,month,day=map(int,data_as_string.split(-))
        date1=cls(year,month,day)
        #返回的是一个初始化后的类
        return date1

    def out_date(self):
        print("year :")
        print(self.year)
        print("month :")
        print(self.month)
        print("day :")
        print(self.day)
r=Data_test2.get_date("2016-8-6")
r.out_date()

 

以上是关于@staticmethod和classmethod的主要内容,如果未能解决你的问题,请参考以下文章

@staticmethod和@classmethod

当我需要在 python 编程中使用@staticmethod 和@classmethod 时? [复制]

python的@classmethod和@staticmethod

@staticmethod和@classmethod的作用与区别

classmethod和staticmethod区别(转载)

@staticmethod和classmethod