@staticmethod和@classmethod 修饰符使用
# -*- coding:utf-8 -*-
# @staticmethod和@classmethod的用法
"""
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法,
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
既然如此,那他们俩又有什么区别呢?
"""
# 从使用上看
# @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样
# @classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数
class A(object):
bar = 1
def foo(self):
print('foo')
@staticmethod
def static_foo():
print('static_foo')
print A.bar
@classmethod
def class_foo(cls):
print('class_foo')
print cls.bar
cls().foo()
A.static_foo()
A.class_foo()
print('------')
# 从实例第一个参数来看
class kls(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
ik1 = kls('arun')
ik2 = kls('seema')
ik1.printd()
ik2.printd()
# 小结:第1,2步:参数传递给方法;第3步:self参数指向当前实例自身;第4步:python解释器运行代码
# 与类交互而不是和实例交互的方法会是怎么样呢?代码难维护
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class kls1(object):
no_inst = 0
def __init__(self):
kls1.no_inst = kls1.no_inst + 1
ik3 = kls1()
ik4 = kls1()
ik5 = kls1()
print(get_no_of_instances(kls1)) # 调用的是类,传递的第一个参数是类,代码较分散
print('-----')
# 使用@classmethod装饰器来创建类方法
class kls2(object):
no_list = 0
def __init__(self):
kls2.no_list = kls2.no_list + 1
@classmethod
def get_no_of_instance(cls):
return cls.no_list
ik6 = kls2()
ik7 = kls2()
print(ik6.get_no_of_instance())
print(ik7.get_no_of_instance())
# 小结:使用实例调用,传的第一个参数也是类,代码较聚合
print('------')
# 经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法
# 比如,更改环境变量或修改其他类的属性等能用到静态方法。这种情况可以直接使用函数解决,但这样同样会扩散类内部的代码,造成维护困难
IND = 'ON'
# def checkid():
# return(IND == 'ON')
class kls3(object):
def __init__(self, data):
self.data = data
@staticmethod
def checkid():
return(IND == 'ON')
def do_reset(self):
if self.checkid():
print('Reset done for:', self.data)
def set_db(self):
if self.checkid():
self.db = 'new db connection'
print('DB connection made for:', self.data)
ik8 = kls3(12)
ik8.do_reset()
ik8.set_db()
print('-----')
# @staticmethod,@classmethod使用的不同
class kls4(object):
def __init__(self, data):
self.data = data
def printd(self):
print(self.data)
@staticmethod
def smethod(*arg):
print('Static:', arg)
@classmethod
def cmethod(*arg):
print('Class:', arg)
ik9 = kls4(23)
ik9.printd()
ik9.smethod(1)
ik9.cmethod(2)
本文来自博客园,作者:ReluStarry,转载请注明原文链接:https://www.cnblogs.com/relustarry/p/15470838.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统