@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)
posted @ 2021-10-27 15:09  ReluStarry  阅读(119)  评论(0编辑  收藏  举报