面试题答案
一键面试- 类方法:
- 行为:子类调用基类的类方法时,子类的类对象会作为第一个参数(即
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
类中调用时,cls
是Sub
类对象,所以打印出“这是基类的类方法,当前类是 Sub”。
- 静态方法:
- 行为:静态方法没有隐式的第一个参数(既不是
self
也不是cls
),它与类和实例没有直接关联。子类调用基类的静态方法时,其行为与在基类中调用时基本一致,因为静态方法不依赖于类或实例的状态。它只是一个存在于类命名空间中的函数,子类继承后调用和在基类中调用没有本质区别。 - 代码示例:
- 行为:静态方法没有隐式的第一个参数(既不是
class Base:
@staticmethod
def static_method():
print("这是基类的静态方法")
class Sub(Base):
pass
Sub.static_method()
- 解释:在上述代码中,
Sub.static_method()
调用了基类Base
的静态方法static_method
。静态方法不依赖于类或实例的状态,所以在子类中调用时,其行为与在基类中调用相同,打印出“这是基类的静态方法”。
总结:类方法与类对象紧密相关,在子类调用时基于子类特性;而静态方法不依赖于类或实例状态,在子类调用和基类调用行为基本一致。