在Jinja和Flask中使用的MarkupSafe中,添加一个str
对象和一个Markup
对象将返回一个Markup
对象:
>>> from flask import Markup
>>> 'foo' + Markup('bar')
Markup('foobar')
但是,如果我直接调用str.__add__
,它将返回一个str
对象:
>>> 'foo'.__add__(Markup('bar'))
'foobar'
因此,似乎将str
和Markup
与+
相加会调用Markup.__add__
,而与操作数的顺序无关。这怎么可能?
答案 0 :(得分:3)
+
运算符调用Markup.__radd__
而不是str.__add__
,因为右操作数的类型(Markup
)是左操作数的类型(str
的子类
(请参阅Difference between a+b and a.__add__(b))
在str.__add__
对象上调用Markup
时,Markup
对象仅被视为str
对象,并且仅考虑str
类型来完成操作