MST

星途 面试题库

面试题:Python类方法与静态方法在继承中的特性

假设有一个基类Base,其中定义了一个类方法class_method和一个静态方法static_method。然后有一个子类Sub继承自Base。请分析并说明在子类中调用这两个方法时,行为上会有什么不同,为什么?请给出相应的代码示例及解释。
17.6万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. 类方法
    • 行为:子类调用基类的类方法时,子类的类对象会作为第一个参数(即cls)传递给类方法。类方法可以访问和修改类相关的状态,并且在子类中调用时,其行为是基于子类的类对象。这意味着类方法可以被子类继承并根据子类的特性进行不同的行为。
    • 代码示例
class Base:
    @classmethod
    def class_method(cls):
        print(f"这是基类的类方法,当前类是 {cls.__name__}")


class Sub(Base):
    pass


Sub.class_method()
  • 解释:在上述代码中,Sub.class_method()调用了基类Base的类方法class_method。由于类方法的第一个参数是类对象,当在Sub类中调用时,clsSub类对象,所以打印出“这是基类的类方法,当前类是 Sub”。
  1. 静态方法
    • 行为:静态方法没有隐式的第一个参数(既不是self也不是cls),它与类和实例没有直接关联。子类调用基类的静态方法时,其行为与在基类中调用时基本一致,因为静态方法不依赖于类或实例的状态。它只是一个存在于类命名空间中的函数,子类继承后调用和在基类中调用没有本质区别。
    • 代码示例
class Base:
    @staticmethod
    def static_method():
        print("这是基类的静态方法")


class Sub(Base):
    pass


Sub.static_method()
  • 解释:在上述代码中,Sub.static_method()调用了基类Base的静态方法static_method。静态方法不依赖于类或实例的状态,所以在子类中调用时,其行为与在基类中调用相同,打印出“这是基类的静态方法”。

总结:类方法与类对象紧密相关,在子类调用时基于子类特性;而静态方法不依赖于类或实例状态,在子类调用和基类调用行为基本一致。