1. 场景前几天,有一个小伙伴过来问我,python 中的 @staticmethod、@classmethod、self、cls 分别代表什么意思,自己平时光顾着用,不知道具体的含义?
事实上,由于 python 语言的灵活性,这部分内容在日常编码过程中,很容易被忽略掉
本篇文章将和大家一起聊聊这几个小知识点
2.@staticmethod装饰器 @staticmethod 修饰的方法称为:静态方法,和普通的函数没有什么区别
下面将聊聊实际项目中几种应用场景
1、要调用一个静态方法,一般使用形式是:「 类名.方法名() 」
class web(object): @staticmethod def foo_staticmethod(): 静态方法 passif __name__ == '__main__': # 直接使用类名+方法名调用 web.foo_staticmethod()当然,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式
# 实例化一个对象instance = web()# 使用实例对象去调用静态方法(不建议)instance.foo_staticmethod()2、针对类中定义的静态变量,可以使用「 类名.变量名 」 的形式去访问
class web(object): # 静态变量(类变量) name = python_web @staticmethod def foo_staticmethod(): 静态方法 # 引用静态变量 print(web.name)3、静态方法内部使用其他静态方法、类方法,同样是使用「 类名.方法名() 」去调用
class web(object): # 静态变量(类变量) name = python_web # 类方法 @classmethod def foo_classmethod_other(cls): print('类方法被调用!') # 另外一个静态方法 @staticmethod def foo_staticmethod_other(): print('另外一个静态方法被调用!') @staticmethod def foo_staticmethod(): 静态方法 # 调用其他静态方法 print(web.foo_staticmethod_other()) # 调用类方法 print(web.foo_classmethod_other())4、静态方法内部调用普通方法,访问实例属性
普通方法和实例属性都必须通过实例对象去引用,不能直接使用类名去访问
class web(object): def __init__(self): self.desc = 实例属性,不共享 def norm_method(self): 普通方法 print('普通方法被调用!') @staticmethod def foo_staticmethod(): 静态方法 instance = web() # 获取实例属性 print(instance.desc) # 调用普通方法 instance.norm_method()5、子类的使用
在子类中调用父类定义好的静态方法,只需要将类名替换为子类名称即可
class web(object): @staticmethod def foo_staticmethod(arg1, arg2): passclass django(web): 子类 passif __name__ == '__main__': # 1、使用类名(父类)去调用静态方法 web.foo_staticmethod(hello, ,airpython) # 2、使用类名(子类)去调用静态方法 django.foo_staticmethod(hello, ,airpython)3.@classmethod装饰器 @classmethod 修饰的方法称为:类方法,在使用的时候,会将类本身作为第一个参数 cls 传递给类方法
# 类方法,第一个参数为cls,代表类本身@classmethoddef foo_classmethod(cls): pass其中,cls 代表外层类本身,可以实例化,也可以直接调用静态方法、类方法、静态变量
下面逐一进行说明
1、要调用一个类方法,一般使用形式是:「 类名.方法名() 」
class web(object): # 类方法,第一个参数为cls,代表类本身 @classmethod def foo_classmethod(cls): passif __name__ == '__main__': # 使用类名去调用类方法 web.foo_classmethod()和静态方法类似,也可以实例化一个类对象,通过这个对象去调用静态方法,但是不建议使用这种方式
2、调用静态变量
静态方法内部引用静态变量有两种方式,分别是:
「 类名.变量名 」「 cls.变量名 」注意:由于 cls 代表就是外层类本身,所以这两种方式等效
class web(object): # 静态变量(类变量) name = python_web # 类方法,第一个参数为cls,代表类本身 @classmethod def foo_classmethod(cls): # 调用静态变量方式一 print(cls.name) # 调用静态变量方式二 print(web.name)3、类方法内部调用其他类方法、静态方法
在一个类方法内部,可以使用「 类名.类方法名() 」、「 类名.静态方法名() 」的形式去调用方法
class web(object): # 静态方法 @staticmethod def foo_staticmethod(): print('静态方法被调用!') # 其他类方法 @classmethod def foo_classmethod_other(cls): print('另外一个类方法被调用!') # 类方法,第一个参数为cls,代表类本身 @classmethod def foo_classmethod(cls): # 调用其他类方法 cls.foo_classmethod_other() # 调用静态方法 cls.foo_staticmethod()if __name__ == '__main__': web.foo_classmethod()4、类方法内部调用普通方法,访问实例属性
需要通过 cls 变量实例化一个类对象,然后通过这个对象去调用普通方法和实例属性
class web(object): def __init__(self): self.desc = 实例属性,不共享 def norm_method(self): 普通方法 print('普通方法被调用!') # 类方法,第一个参数为cls,代表类本身 @classmethod def foo_classmethod(cls): # 如果要调用实例属性,必须使用cls实例化一个对象,然后再去引用 print(cls().desc) # 如果要调用普通方法,必须使用cls实例化一个对象,然后再去引用 cls().norm_method()5、子类的使用
在子类中调用父类定义好的类方法,只需要将类名替换为子类名称即可,代码和静态方法类似
4.区别下面总结一下普通方法、静态方法、类方法的区别
普通方法:第一个参数 self 代表实例对象本身,可以使用 self 直接引用定义的实例属性和普通方法;如果需要调用静态方法和类方法,通过「 类名.方法名() 」调用即可静态方法:使用「 类名.静态变量 」引用静态变量,利用「 类名.方法名() 」调用其他静态方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法类方法:第一个参数 cls 代表类本身(等价),通过「 cls.静态变量 」或「 类名.静态变量 」引用静态变量,利用「 cls.方法名() 」或「 类名.方法名() 」去调用静态方法和类方法;如果需要调用普通方法,需要先实例化一个对象,然后利用对象去调用普通方法静态方法和类方法是针对类定义的,除了可以使用类名去调用,也可以使用实例对象去调用,但是不建议5.最后一般来说,如果方法内部涉及到实例对象属性的操作,建议用普通方法;如果方法内部没有操作实例属性的操作,仅仅包含一些工具性的操作,建议使用静态方法;而如果需要对类属性,即静态变量进行限制性操作,则建议使用类方法
调整MAX8660/MAX8661的输出电压
雅典娜云池将投资50亿元参与区块链存储项目的生态建设
基于智能定位功能的座位预约卡 解决图书馆找座难题的理想方案
新式可穿戴设备:“可穿戴”纹身
模拟芯片公司艾为电子拟闯关科创板 已进入上市辅导阶段
Python中普通方法、静态方法、类方法的区别
全球汽车半导体面临新挑战 分析师称有库存过剩担忧
80C32E单片机与TLV2548的接口电路控制设计
布局3D NAND技术 SanDisk与东芝合力扩建Fab 5
车道偏离报警(ldw)系统技术
什么是磁传感器?最常用的磁传感器类型及应用
环境空气质量监测子站是什么
智能电动汽车会在未来颠覆整个行业
PSE的硬件原理图-电路图
PCB接线端子 pcb接线端子有哪几种
“通信电子与信息化专家”张武军先生为金航标kinghelm销售团队射频微波和5G通信应用知识培训
关于停车场超声波探测器防水泄压膜的介绍
一加7 Pro在DxOMARK排名中的相机得分曝光为114分排名榜单第五
中国现在的区块链专利申请怎么样
MarkDown简明语法手册