您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python的字符串和unicode强制/魔术函数如何工作?

5b51 2022/1/14 8:20:43 python 字数 3934 阅读 472 来源 www.jb51.cc/python

我使用的是Python版本:2.7.3.在Python中,我们使用魔术方法__str__和__unicode__来定义我们的自定义类上的str和unicode的行为:>>> class A(object): def __str__(self): print 'Casting A to str' return u'Stri

概述

我使用的是Python版本:2.7.3.

在Python中,我们使用魔术方法__str__和__unicode__来定义我们的自定义类上的str和unicode的行为:

>>> 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__和__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 "
  

调用str.mro()和unicode.mro()表示两者都是basestring的子类.但是,__ unicode__还允许返回缓冲区对象,缓冲区对象直接从对象继承而不从basetring继承.

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

However,__unicode__ also allows returning of buffer objects,which
directly object and don’t inherit from basestring.

这是不正确的. unicode()可以转换字符串或缓冲区.这是使用认编码将传递的参数转换为unicode的“最佳尝试”(这就是为什么它表示强制).它将始终返回一个unicode对象.

So,my question is,what actually happens when str and unicode are
called? What are the return value requirements on __str__ and
__unicode__ for use in str and unicode?

__str__应返回对象的非正式,人性化的字符串表示.当有人在您的对象上使用str(),或者您的对象是print语句的一部分时,就会调用方法.

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

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

有关这些“魔术方法”的更多信息和详细信息,请阅读文档的data model部分.

总结

以上是编程之家为你收集整理的Python的字符串和unicode强制/魔术函数如何工作?全部内容,希望文章能够帮你解决Python的字符串和unicode强制/魔术函数如何工作?所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶