Python基类方法调用:意外行为

时间:2009-04-23 07:31:02

标签: python inheritance dictionary

为什么str(A())似乎在下面的示例中呼叫A.__repr__()而不是dict.__str__()

class A(dict):
    def __repr__(self):
        return 'repr(A)'
    def __str__(self):
        return dict.__str__(self)

class B(dict):
    def __str__(self):
        return dict.__str__(self)

print 'call: repr(A)  expect: repr(A)  get:', repr(A())   # works
print 'call: str(A)   expect: {}       get:', str(A())    # does not work
print 'call: str(B)   expect: {}       get:', str(B())    # works

输出:

call: repr(A)  expect: repr(A)  get: repr(A)
call: str(A)   expect: {}       get: repr(A)
call: str(B)   expect: {}       get: {}

3 个答案:

答案 0 :(得分:9)

str(A())会调用__str__,然后调用dict.__str__()

dict.__str__()返回值repr(A)。

答案 1 :(得分:3)

我修改了代码以清除问题:

class A(dict):
   def __repr__(self):
      print "repr of A called",
      return 'repr(A)'
   def __str__(self):
      print "str of A called",
      return dict.__str__(self)

class B(dict):
   def __str__(self):
      print "str of B called",
      return dict.__str__(self)

输出是:

>>> print 'call: repr(A)  expect: repr(A)  get:', repr(A())
call: repr(A)  expect: repr(A)  get: repr of A called repr(A)
>>> print 'call: str(A)   expect: {}       get:', str(A())
call: str(A)   expect: {}       get: str of A called repr of A called repr(A)
>>> print 'call: str(B)   expect: {}       get:', str(B())
call: str(B)   expect: {}       get: str of B called {}

表示str函数自动调用repr函数。由于它是用A类重新定义的,因此它会返回'意外'值。

答案 2 :(得分:2)

我已经发布了一个解决方法。看看吧......你可能会发现它很有用: http://blog.teltub.com/2009/10/workaround-solution-to-python-strrepr.html

P.S。阅读原帖,我也介绍了这个问题......问题在于意外的行为让你感到惊讶......