静态方法: 用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用。
普通方法: 默认有个self参数,且只能被对象调用。
类方法: 默认有个 cls 参数,可以被类和对象调用,需要加上 @classmethod 装饰器。
class Classname:
@staticmethod
def fun():
print('静态方法')
@classmethod
def a(cls):
print('类方法')
# 普通方法
def b(self):
print('普通方法')
Classname.fun()
Classname.a()
C = Classname()
C.fun()
C.a()
C.b()
输出为:
静态方法
类方法
静态方法
类方法
普通方法
“self”应是实例方法的第一个参数,“cls”应是类方法的第一个参数,这是Python语言常规约定。
类的方法不需要访问实例时,使用普通的实例方法定义虽然可以实现功能,但会在使用时要求必须由类 的实例调用此方法。这就造成使用过程中一次冗余的实例生成、回收过程,代码本身编写和阅读时也显 得冗余。
因此,在类的方法不需要访问实例时,根据以下场景将方法定义为类方法或静态方法:
1). 在不需要访问实例,需要访问类属性或方法时,建议使用 @classmethod 将方法定义为类方法;
2). 在不需要访问实例也不需要访问类属性或方法时,建议使用 @staticmethod 将方法定义为静态方法
class MyClass:
class_attr = "MyClass.class_attr"
def __init__(self):
self.x = 100
self.y = 200
@classmethod
def refresh_class_attr(cls, string_value: str):
cls.class_attr = string_value
return cls.class_attr
@staticmethod
def add_value(a, b):
return a + b
def mul_value(self):
return self.x*self.y