【发布时间】:2022-01-03 16:48:54
【问题描述】:
为什么下面的代码打印的是error msg而不是ABC\nerror msg?
class CustomException(Exception):
"""ABC"""
def __init__(self, *args):
super().__init__(*args)
self.__str__ = self._wrapper(self.__str__)
def _wrapper(self, f):
def _inner(*args, **kwargs):
return self.__doc__ + '\n' + f(*args, **kwargs)
return _inner
print(CustomException('error msg'))
【问题讨论】:
-
__str__在类CustomException上调用,而不是在单个对象上调用。您只是在单个对象self上更改__str__。 -
您是否有理由尝试对
__str__进行包装和替换,而不是仅仅重新实现__str__方法 并调用super().__str__()? -
@khelwood 是的,我完全错过了,感谢您的提示。宫城先生,不,除了把事情复杂化之外没有别的原因 :) 我会按照你的方式做,也谢谢!
-
@khelwood
__str__是在 CustomException 类上调用的,而不是在单个对象上调用的。 我有点困惑。__str__不是实例方法吗? -
@TheScore 它是一个实例方法,因为实例是它的第一个参数;但它是在类上查找的,并调用将实例作为第一个参数传递。通常这是调用魔法方法的方式。
标签: python python-3.x exception decorator wrapper