python之类中静态⽅法(@staticmethod),类⽅法
(@classmethod。。。前⾔
python 类⾥⾯常⽤的⽅法有3个:静态⽅法(@staticmethod),类⽅法(@classmethod)和实例⽅法(self)。
函数
⽅法跟函数是有区别的,函数定义是def 关键字定义(外⾯没class)。
def fun(): a = \"hello\" return a# 函数调⽤res = fun()print(res)
函数调⽤使⽤函数名称后⾯加括号就能调⽤了
实例⽅法(self)
类⾥⾯的⽅法定义也是⽤def 关键字,注意在类⾥⾯叫⽅法了,不叫函数,定义的⽅法默认在括号⾥⾯加⼀个self参数。self 是类本⾝的实例对象,所以在看到def 定义的⽅法括号后⾯有self参数的叫实例⽅法。
class A(object): count = 0 def fun(self): b = \"world\" return b
# A类不能直接调⽤fun# print(A.fun())a = A()
print(a.fun())
静态⽅法(@staticmethod)
我们可以在函数⾥⾯写⼀个类:
def fun(): a = \"hello\"
class A(object): count = 0
def fun(self): b = \"world\" return b return A
于是会想到,在类⾥⾯是不是也可以写⼀个函数呢?【类⾥⾯写函数,注意不是⽅法】于是就有了静态⽅法(@staticmethod),静态⽅法的出现就是为了在类⾥⾯可以写⼀个函数,当普通的函数去调⽤。
定义静态⽅法需使⽤@staticmethod装饰器,并且括号后⾯不需要self参数了。
class A(object): count = 0 def fun(self): b = \"world\" return b @staticmethod def start():
print(\"start-----\")# 不⽤实例化也能调⽤
A.start()
# 实例化也能调⽤a = A()a.start()
静态⽅法不需要实例化可以直接调⽤,实例化后也能调⽤,可以理解成函数。
类⽅法(@classmethod)
类⾥⾯有2个概念,属性和⽅法。
既然已经知道了A类的属性和A()实例对象属性是不⼀样的,再回到前⾯的实例⽅法概念上,实例⽅法是A()实例对象的⽅法。
既然A()实例对象有实例⽅法,那么A类当然也有类⽅法的概念了,于是可以在⽅法上加上@classmethod装饰器声明它是类⽅法,并且括号第⼀个参数cls是指类本⾝。
class A(object): count = 0 def fun(self): b = \"world\" return b @staticmethod def start():
print(\"start-----\") @classmethod def create(cls):
print(\"create--------\")
# 不需要实例化,类名称直接调⽤类⽅法A.create()
# 实例化也能调⽤类⽅法a = A()a.create()
类⽅法使⽤场景
实例⽅法和静态⽅法⼩伙伴们应该是经常⽤的,类⽅法这个概念本⾝⽐较难懂,就算看懂了也不知道如何⽤到具体场景上,在⽹上搜到⼀个案例讲解的挺好的。
class DataTest(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
def out_date(self):
print(\"year :\", self.year) print(\"month :\", self.month) print(\"day :\", self.day)t = DataTest(2021, 8, 18)t.out_date()
运⾏结果:
year : 2021month : 8day : 18
但是如果⽤户输⼊的是 \"2016-8-1\" 这样的字符格式,那么就需要调⽤Date_test 类前做⼀下处理:
string_date = '2018-8-18'
year, month, day = map(int, string_date.split('-'))s = DataTest(year, month, day)print(s.out_date())
先把‘2018-8-18’ 分解成 year,month,day三个变量,然后转成int,再调⽤DataTest(year, month, day) 也很符合期望。那我可不可以把这个字符串处理的函数放到 DateTest 类当中呢?
那么@classmethod 就开始出场了:【类最基本的作⽤是实例化出⼀个对象,但是有的时候再实例化之前,就需要先和类做⼀定的交互,这种交互可能会影响实际实例化的过程,所以必须放在调⽤构造函数之前。】
class DataTest(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
def out_date(self):
print(\"year :\", self.year) print(\"month :\", self.month) print(\"day :\", self.day)
@classmethod
def get_data(cls, string_date): \"\"\"处理'2018-8-18'字符格式\"\"\"
year, month, day = map(int, string_date.split('-')) return cls(year, month, day)
定义⼀个get_data类⽅法,处理完字符串后返回这个类的实例对象:【与实例化类返回类的实例对象的作⽤相同】
r = DataTest.get_data('2018-8-18')r.out_date()
这样同样可以达到实例化的效果,于是就兼容了前⾯的代码了。