目录
一、@staticmethod和@classmethod共同点和区别:
2、@staticmethod和@classmethod实际应用:
一、@staticmethod和@classmethod共同点和区别:
1、共同点:
都是用来声明静态方法的。
静态方法是不需要实例化类就可以调用的方法,等同于普通函数,调用格式为:类名.方法名。
2、区别:
-
@staticmethod不需要表示自身对象的self和自身类的cls参数,就像普通函数一样定义既可。
-
@classmethod也不需要self参数,但是第一参数需要表示自身类的cls参数,避免硬编码。
在静态方法中引用了类中静态成员,可以用类名.静态成员名,如果一旦类名改变,所有的引用都需要修改类名。
如果是用@classmethod声明的静态方法,可以用cls参数引用静态成员,类名发生改变,就不需要改变。
二、代码实例演示:
1、静态变量和成员变量区别:
class Myclass:
bar = 1 # 静态变量
def __init__(self) -> None:
self.count = 20 # count就是成员变量
def process(self): # 定义一个普通方法
print('process:',self.count)
# 怎么确定是静态变量,不需要实例化就可以调用。
print(Myclass.bar)
# count是成员变量,需要实例化才能调用
c = Myclass()
print(c.count)
# 输出:
# 1
# 20
2、@staticmethod和@classmethod实际应用:
class Myclass:
bar = 1 # 静态变量
def __init__(self) -> None:
self.count = 20 # _count就是成员变量
def process(self): # 定义一个普通方法
print('process:',self.count)
@staticmethod
def static_process():
print('static_process')
print(Myclass.bar)
@classmethod
def class_process(cls):
print('class_process')
print(cls.bar) # 调用静态变量
print(cls)
cls().process() # 调用方法实例化
print(cls().count)
Myclass.static_process()
Myclass.class_process()
Myclass.bar = 123
Myclass.static_process()
结果如下图: