环境: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__
您可以在后备__repr__
通过超一流的法super().__repr__()
我会通过继承一个新类下面显示的例子。
因此,如果我们有一个父class B
如下,与它自己的__repr__
定义
class B:
def __repr__(self):
return 'This is repr of B'
然后我们有一个孩子class A
和以前一样,从继承B
,它可以回落到__repr__
B的如下
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))
正如预期的那样,第一壳体将触发__repr__
A和第二壳体将触发__repr__
B的
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>
我想你要找的,
super().__repr__()
class A:
# original_repr = ?__repr__
def __init__(self, switch):
self.switch = switch
def __repr__(self):
return super().__repr__()
def __repr__(self):
if self.switch:
return "Hello"
return super().__repr__()