定义区别
- 静态方法:使用
@staticmethod
装饰器定义,其函数定义中不需要特定的默认参数。
class MyClass:
@staticmethod
def static_method():
print("这是一个静态方法")
- 类方法:使用
@classmethod
装饰器定义,其函数定义中第一个参数通常命名为 cls
,代表类本身。
class MyClass:
@classmethod
def class_method(cls):
print(f"这是一个类方法,类为 {cls.__name__}")
调用方式区别
- 静态方法:既可以通过类名调用,也可以通过实例对象调用。
MyClass.static_method() # 通过类名调用
obj = MyClass()
obj.static_method() # 通过实例对象调用
- 类方法:同样既可以通过类名调用,也可以通过实例对象调用。不过在调用时,会自动将类作为第一个参数
cls
传入。
MyClass.class_method() # 通过类名调用
obj = MyClass()
obj.class_method() # 通过实例对象调用
传入参数区别
- 静态方法:不需要传入代表类或实例的特殊参数,其参数完全由调用者定义。
- 类方法:会自动传入类对象作为第一个参数
cls
,后续参数才由调用者定义。
应用场景
- 静态方法应用场景:
- 工具函数:当一个方法与类的关系不大,只是在逻辑上属于这个类的范畴时,可定义为静态方法。例如数学计算工具类中的方法。
class MathUtils:
@staticmethod
def add(a, b):
return a + b
result = MathUtils.add(3, 5)
print(result)
- **不依赖实例状态和类状态的通用操作**:如日志记录方法,不依赖于类或实例的特定状态。
class Logger:
@staticmethod
def log(message):
print(f"日志: {message}")
Logger.log("程序开始运行")
- 类方法应用场景:
- 工厂方法:用于创建类的实例,根据不同条件返回不同类型的实例。
class Animal:
def speak(self):
pass
class Dog(Animal):
def speak(self):
print("汪汪汪")
class Cat(Animal):
def speak(self):
print("喵喵喵")
class AnimalFactory:
@classmethod
def create_animal(cls, animal_type):
if animal_type == 'dog':
return Dog()
elif animal_type == 'cat':
return Cat()
else:
return None
dog = AnimalFactory.create_animal('dog')
dog.speak()
- **访问或修改类的属性**:当方法需要访问或修改类的属性,而不是实例的属性时。
class Counter:
count = 0
@classmethod
def increment(cls):
cls.count += 1
print(f"计数: {cls.count}")
Counter.increment()
Counter.increment()