编程后端开发

什么是Python中的类装饰器?如何利用它们修改或补充类的功能?请举例并讨论可能的细节。

用 Hintsage AI 助手通过面试

答案。

类装饰器是一个接受类作为参数并返回修改后的或全新类的函数。通过它们,可以动态添加方法,修改现有方法的行为,甚至返回一个子类以扩展原始类的功能。

最简单的类装饰器示例:

def add_repr(cls): def __repr__(self): return f'<{cls.__name__}: {self.__dict__}>' cls.__repr__ = __repr__ return cls @add_repr class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print(p) # <Point: {'x': 3, 'y': 4}>
  • 装饰器 add_repr 动态为所有应用它的类添加了 __repr__ 方法。

细节:

  • 类装饰器不仅可以返回对类的嵌套,还有可能返回完全包裹的(例如,代理类或继承类)。
  • 如果装饰器不支持在创建类实例时使用的 *args**kwargs,则可能会出现错误。

具有挑战性的问题。

如果依次应用两个类装饰器会发生什么?它们的应用顺序总是明显的吗?

答案:

装饰器的应用是“自下而上”的:首先应用直接在类声明上方的装饰器,然后是上方的下一个,以此类推。顺序非常重要,因为第一个装饰器的结果会传递给第二个,依此类推。

@dec1 @dec2 class Test: ... # 等同于: # Test = dec1(dec2(Test))

由于对主题细节的不熟悉而导致的实际错误示例。


故事

在电子商务应用中,想要记录类的方法,但意外地从装饰器返回了错误的对象,导致方法失去了类特性,从而无法正确继承,破坏了模型的工作。


故事

在项目中,为自动生成新方法使用了一个添加装饰器,但在返回子类时忘记了 super()。结果破坏了层次结构和 MRO,导致子类中的基础类调用无法工作。


故事

在数据管道中尝试用多个装饰器(记录器、变更跟踪器)包装类,但由于应用顺序错误导致了方法名称冲突,导致生产环境中的错误,因为“丢失”的方法。