1

本段以下的所有内容均来自《实用 Maya 编程》一书。在倒数第二行中,作者说print带有参数的语句t隐式调用str(t),我想知道为什么,在第二个代码块中作者创建vect并将其分配给 value xform.translate.get(),他不能继续使用t哪个也分配给xform.translate.get()

>>> xform.translate
Attribute(u'pSphere1.translate')
>>> t = xform.translate.get()
>>> print t
[0.0, 0.0, 0.0]

突出显示的球体变换的平移值似乎是一个列表。它不是。翻译值是 pymel.core.datatypes.Vector 的一个实例。有时我们需要更积极地内省对象。我认为这是 PyMEL 犯错误的少数几个领域之一。调用 str(t) 会返回一个看起来像是来自列表的字符串,而不是看起来像是来自 Vector 的字符串。确保你有正确的类型。我花了几个小时寻找使用 Vector 而不是列表的错误,反之亦然。

>>> vect = xform.translate.get()
>>> lst = [0.0, 0.0, 0.0]
>>> str(vect)
'[0.0, 0.0, 0.0]'
>>> str(lst)
'[0.0, 0.0, 0.0]'
>>> print t, lst # The print implicitly calls str(t)
[0.0, 0.0, 0.0] [0.0, 0.0, 0.0]
4

1 回答 1

4

那是因为 Python 的数据模型。根据文档

object.__str__(self)str(object)由内置函数 调用,format()print()计算对象的“非正式”或可很好打印的字符串表示。返回值必须是字符串对象。

此方法的不同之处在于object.__repr__()不期望__str__()返回有效的 Python 表达式:可以使用更方便或更简洁的表示。

内置类型对象调用定义的默认实现 object.__repr__()

如您所见,Python 的内部print(object)调用 object.__str__()会返回对象的字符串表示形式。调用str(object)也返回object.__str__()

由于这个事实,两者print(object)都会str(object)为您提供相同的视觉输出。

于 2015-12-06T12:05:03.943 回答