Flask接口签名sign原理与实例代码浅析
430
2022-08-28
python之类中静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)的使用与区别
前言
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()实例对象的方法。
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()
这样同样可以达到实例化的效果,于是就兼容了前面的代码了。
去期待陌生,去拥抱惊喜。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~