【发布时间】:2019-05-14 11:45:14
【问题描述】:
环境:Python 2.7(可能相关)。
例如,我想调用类原始__repr__ 方法,具体取决于是否设置了实例上的属性。
class A(object):
# original_repr = ?__repr__
def __init__(self, switch):
self.switch = switch
def __repr__(self):
if self.switch:
return self._repr()
else:
# return saved original __repr__ method.
def custom_repr(self):
pass
a = A()
a._repr = MethodType( custom_repr, a, A)
如何保存类的__repr__方法?
显然我不能像在一个实例中那样使用self。
也不能使用A.__repr__,因为当时A本身还没有定义。
编辑:有人建议使用super().__repr__,但是,我在代码中对其进行了测试:
class C(object):
pass
class D(object):
def __repr__(self):
return super(self.__class__).__repr__()
c = C()
d = D()
# repr(c) --> '<__main__.C object at 0x0000000003AEFBE0>'
# repr(d) --> "<super: <class 'D'>, NULL>"
可以看到super().__repr__和原来的__repr__不一样
【问题讨论】:
-
我认为您可以摆脱
A._repr = my_func,但您必须在获得任何实例之前这样做,但重要的问题是您为什么要这样做? -
使用
super().__repr__() -
@Nullman 当然是为了圣诞老人的荣耀......好吧,实际原因是我在某些情况下覆盖了
__eq__魔术方法,但在其他情况下没有,所以我需要一个默认的__eq__回退到的方法。
标签: python python-2.7 class