我来自C#背景,这些东西非常容易-试图将其翻译成适用于Maya的Python。
必须有一个更好的方法来做到这一点。基本上,我正在寻找创建一个Vector类,该类将仅具有x,y和z坐标,但是如果此类返回一个包含所有3个坐标的元组,并且可以通过x编辑该元组的值,那将是理想的选择, y和z属性,以某种方式。
到目前为止,这就是我所拥有的,但是必须有比使用exec语句更好的方法,对吗?我讨厌使用exec语句。
class Vector(object):
'''Creates a Maya vector/triple, having x, y and z coordinates as float values'''
def __init__(self, x=0, y=0, z=0):
self.x, self.y, self.z = x, y, z
def attrsetter(attr):
def set_float(self, value):
setattr(self, attr, float(value))
return set_float
for xyz in 'xyz':
exec("%s = property(fget=attrgetter('_%s'), fset=attrsetter('_%s'))" % (xyz, xyz, xyz))
最佳答案
编辑:我用@unutbu的原始内容修改了我的答案的代码,以简化代码并使其变得更清晰。在最新版本中,完全删除了@staticmethod
,并替换为嵌套的单线。外部函数和嵌套类已重命名为AutoFloatProperties
和_AutoFloatProperties
,以反射(reflect)它们转换和存储分配为float的值的特殊行为。尽管如此,@ unutbu自己使用类装饰器而不是元类的修订答案是一个稍微简单的解决方案,尽管内部和用法非常相似。
def AutoFloatProperties(*props):
'''metaclass'''
class _AutoFloatProperties(type):
# Inspired by autoprop (http://www.python.org/download/releases/2.2.3/descrintro/#metaclass_examples)
def __init__(cls, name, bases, cdict):
super(_AutoFloatProperties, cls).__init__(name, bases, cdict)
for attr in props:
def fget(self, _attr='_'+attr): return getattr(self, _attr)
def fset(self, value, _attr='_'+attr): setattr(self, _attr, float(value))
setattr(cls, attr, property(fget, fset))
return _AutoFloatProperties
class Vector(object):
'''Creates a Maya vector/triple, having x, y and z coordinates as float values'''
__metaclass__ = AutoFloatProperties('x','y','z')
def __init__(self, x=0, y=0, z=0):
self.x, self.y, self.z = x, y, z # values converted to float via properties
if __name__=='__main__':
v=Vector(1,2,3)
print(v.x)
# 1.0
v.x=4
print(v.x)
# 4.0
关于Python向量类别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2401185/