编辑:我用@unutbu的原版答案对代码进行了更多的修改,以简化代码并使所做的工作更清晰。在最新版本中,@staticmethod已被完全删除,并替换为嵌套的一行程序。外部函数和嵌套类已重命名为AutoFloatProperties和_AutoFloatProperties,以反映它们转换和存储指定为浮点值的特殊行为。尽管如此,@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