本段以下的所有内容均来自Practical Maya Programming一书。在第二行到最后一行中,作者说print
语句带参数t
隐式调用str(t)
,我想知道原因,同样在第二个代码块中作者创建vect
并将其分配给值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而不是列表的bug,反之亦然。
>>> 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]
答案 0 :(得分:4)
这是因为Python的数据模型。根据{{3}}:
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)
都会为您提供相同的视觉输出。