2 回答

TA贡献1802条经验 获得超5个赞
检查类__dict__以获取"__repr__"密钥:
if "__repr__" in vars(cls):
# repr overriden in class. Don't mess with it
else:
cls.__repr__ = AutoRepr.__repr__

TA贡献1773条经验 获得超3个赞
当然,走过去mro并确保__repr__您击中的第一个不是来自object:
In [18]: class A:
...: pass
...:
...: class B(A):
...: def __repr__(self): return "a repr"
...:
...: class C(B):
...: pass
...:
...:
In [19]: def is_non_default_repr(klass):
...: for superclass in klass.mro():
...: if '__repr__' in vars(superclass):
...: return superclass is not object
...: return False # should we ever get here? maybe raise error?
...:
...:
In [20]: is_non_default_repr(A)
Out[20]: False
In [21]: is_non_default_repr(B)
Out[21]: True
In [22]: is_non_default_repr(C)
Out[22]: True
__slots__我相信,如果元类使用,这将失败,但这将是一个很大的失常。
编辑:
重新阅读您的要求,您可以执行以下操作:
In [23]: def which_method(klass, methodname):
...: for superclass in klass.mro():
...: if methodname in vars(superclass):
...: return superclass
...: raise ValueError(f"{methodname} not a member")
...:
...:
In [24]: which_method(C, '__repr__') is not object
Out[24]: True
In [25]: which_method(C, '__repr__')
Out[25]: __main__.B
In [26]: which_method(C, '__repr__') is C
Out[26]: False
In [27]: which_method(B, '__repr__') is B
Out[27]: True
完全取决于您需要的语义。我想你明白要点了。
添加回答
举报