为什么str + Markup返回一个Markup对象?

时间:2019-10-24 20:14:30

标签: python flask jinja2

在Jinja和Flask中使用的MarkupSafe中,添加一个str对象和一个Markup对象将返回一个Markup对象:

>>> from flask import Markup
>>> 'foo' + Markup('bar')
Markup('foobar')

但是,如果我直接调用str.__add__,它将返回一个str对象:

>>> 'foo'.__add__(Markup('bar'))
'foobar'

因此,似乎将strMarkup+相加会调用Markup.__add__,而与操作数的顺序无关。这怎么可能?

1 个答案:

答案 0 :(得分:3)

+运算符调用Markup.__radd__而不是str.__add__,因为右操作数的类型(Markup)是左操作数的类型(str的子类

(请参阅Difference between a+b and a.__add__(b)

str.__add__对象上调用Markup时,Markup对象仅被视为str对象,并且仅考虑str类型来完成操作