环境: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__
答案 0 :(得分:1)
我认为您正在寻找
super().__repr__()
class A:
# original_repr = ?__repr__
def __init__(self, switch):
self.switch = switch
def __repr__(self):
return super().__repr__()
答案 1 :(得分:1)
def __repr__(self):
if self.switch:
return "Hello"
return super().__repr__()
答案 2 :(得分:0)
您可以通过__repr__
退回到超类的super().__repr__()
方法。下面将通过子类化一个新类来显示示例。
因此,如果我们具有如下的父项class B
,并定义了自己的__repr__
class B:
def __repr__(self):
return 'This is repr of B'
然后我们像以前一样有一个孩子class A
,它是从B
继承的,它可以按如下方式回落到B的__repr__
class A(B):
def __init__(self, switch):
super().__init__()
self.switch = switch
def __repr__(self):
#If switch is True, return repr of A
if self.switch:
return 'This is repr of A'
#Else return repr of B by calling super
else:
return super().__repr__()
您可以通过执行此操作来测试
print(A(True))
print(A(False))
按预期,第一种情况将触发A的__repr__
,第二种情况将触发B的__repr__
。
This is repr of A
This is repr of B
如果A只是从对象继承的普通类,则代码将更改为
class A:
def __init__(self, switch):
super().__init__()
self.switch = switch
def __repr__(self):
#If switch is True, return repr of A
if self.switch:
return 'This is repr of A'
#Else return repr of superclass by calling super
else:
return super().__repr__()
输出将更改为
print(A(True))
#This is repr of A
print(A(False))
#<__main__.A object at 0x103075908>