面试题答案
一键面试定义方式
- 静态方法:使用
@staticmethod
装饰器定义,其方法不需要self
或cls
参数。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()
使用场景
- 静态方法:
- 当方法不需要访问类或实例的任何状态时使用。例如工具函数,它与类相关,但不依赖于类的特定实例或类状态。
- 示例:计算圆的面积的工具函数,不依赖于任何类或实例的状态。
import math class Circle: def __init__(self, radius): self.radius = radius @staticmethod def calculate_area(r): return math.pi * r * r area = Circle.calculate_area(5) print(area)
- 类方法:
- 当方法需要访问或修改类级别的属性,或者需要根据不同的输入创建不同类型的类实例时使用。
- 示例:根据字符串创建不同类型日期对象的工厂方法。
from datetime import datetime class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @classmethod def from_string(cls, date_str): year, month, day = map(int, date_str.split('-')) return cls(year, month, day) date = Date.from_string('2023-10-01') print(date.year, date.month, date.day)