MST

星途 面试题库

面试题:Python类的静态方法与类方法的区别

请详细阐述Python中类的静态方法和类方法在定义方式、调用方式以及使用场景上有什么区别。并分别给出一个简单的示例代码说明。
21.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

定义方式

  1. 静态方法:使用@staticmethod装饰器定义,其方法不需要selfcls参数。
    class MyClass:
        @staticmethod
        def static_method():
            print("这是一个静态方法")
    
  2. 类方法:使用@classmethod装饰器定义,方法第一个参数通常命名为cls,代表类本身。
    class MyClass:
        @classmethod
        def class_method(cls):
            print(f"这是一个类方法,类名为: {cls.__name__}")
    

调用方式

  1. 静态方法:可以通过类名直接调用,也可以通过类的实例调用。
    MyClass.static_method()
    obj = MyClass()
    obj.static_method()
    
  2. 类方法:可以通过类名直接调用,也可以通过类的实例调用,在通过实例调用时,实例所属的类会作为cls参数传递进去。
    MyClass.class_method()
    obj = MyClass()
    obj.class_method()
    

使用场景

  1. 静态方法
    • 当方法不需要访问类或实例的任何状态时使用。例如工具函数,它与类相关,但不依赖于类的特定实例或类状态。
    • 示例:计算圆的面积的工具函数,不依赖于任何类或实例的状态。
    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)
    
  2. 类方法
    • 当方法需要访问或修改类级别的属性,或者需要根据不同的输入创建不同类型的类实例时使用。
    • 示例:根据字符串创建不同类型日期对象的工厂方法。
    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)