@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的主要内容,如果未能解决你的问题,请参考以下文章
当我需要在 python 编程中使用@staticmethod 和@classmethod 时? [复制]
python的@classmethod和@staticmethod
@staticmethod和@classmethod的作用与区别