5

我正在使用 Python 版本:2.7.3。

在 Python 中,我们使用魔法方法__str____unicode__定义自定义类的行为:strunicode

>>> class A(object):
  def __str__(self):
    print 'Casting A to str'
    return u'String'
  def __unicode__(self):
    print 'Casting A to unicode'
    return 'Unicode'


>>> a = A()
>>> str(a)
Casting A to str
'String'
>>> unicode(a)
Casting A to unicode
u'Unicode'

该行为表明来自__str__and的返回值__unicode__被强制为str或者unicode取决于运行哪个魔术方法。

但是,如果我们这样做:

>>> class B(object):
  def __str__(self):
    print 'Casting B to str'
    return A()
  def __unicode__(self):
    print 'Casting B to unicode'
    return A()


>>> b = B()
>>> str(b)
Casting B to str

Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
    str(b)
TypeError: __str__ returned non-string (type A)
>>> unicode(b)
Casting B to unicode

Traceback (most recent call last):
  File "<pyshell#48>", line 1, in <module>
    unicode(b)
TypeError: coercing to Unicode: need string or buffer, A found

调用str.mro()unicode.mro()表示两者都是basestring. 但是,__unicode__也允许返回buffer直接继承自object而不继承自的对象basestring

str所以,我的问题是,当和unicode被调用时实际发生了什么?__str____unicode__中使用str和的返回值要求是unicode什么?

4

1 回答 1

4

但是,__unicode__也允许返回缓冲区对象,这些对象直接对象而不是从基字符串继承。

这是不正确的。unicode()可以转换字符串或缓冲区。这是使用默认编码将传递的参数转换为 unicode 的“最佳尝试”(这就是它说coercing的原因)。它总是会返回一个 unicode 对象。

所以,我的问题是,调用 str 和 unicode 时实际发生了什么?__str__str和 __unicode__unicode的返回值要求是什么?

__str__应该返回对象的非正式的、人性化的字符串表示。str()当有人在您的对象上使用时,或者当您的对象是打印语句的一部分时,这就是所谓的。

__unicode__应该总是返回一个unicode对象。如果未定义此方法,__str__则调用该方法,然后将结果强制转换为 unicode(通过将它们传递给unicode())。

在您的第二个示例中,您正在返回无效对象,这就是您看到错误消息的原因。__unicode__由于副作用,您的第一个示例似乎适用,但它也没有正确编写。

文档的数据模型部分值得一读,以获取有关这些“魔术方法”的更多信息和详细信息。

于 2013-05-07T08:10:11.293 回答