优雅的分组属性方式

时间:2011-10-17 14:45:09

标签: python

我想对一个类的实例的属性进行分组,这样就可以很容易地遍历属于一个组的所有属性。显而易见的答案是将所有这些放入列表或字典中,但后来我无法将它们作为我的对象的属性来访问,我宁愿这样做。

有些代码应该清楚我想要的内容。在这里,我实际上有一个列表和真实的属性。

class Vectors(object):

    def __init__(self, v1, v2, v3):
        self.v1 = v1
        self.v2 = v2
        self.v3 = v3
        self.rotatable = ['v2', 'v3']

    def rotate(self, angle):
        for v in self.rotable:
            new_vector = do_rotate(getattr(self, v), angle)
            setattr(self, v, new_vector)

class MoreVectors(Vectors):
    def __init__(self, v4, *args, **kwargs):
        super(MoreVectors, self).__init__(*args, **kwargs)
        self.v4 = v4
        self.rotable.append('v4')

现在,在调用rotate()时,它知道要旋转哪些向量,我可以动态地向该列表添加更多向量。然而,虽然这样做起了作用,但对我来说看起来并不优雅,因为我必须自己管理列表。

有没有更简单的方法来写这个?我考虑将所有属性存储在字典中,其中每个组都是一个键,然后使用properties()让我访问字典中的所有项目作为属性。这对我来说足够干净,但我不知道如何在方法中动态设置属性。

1 个答案:

答案 0 :(得分:3)

如何使rotatable成为Vector类的属性:

class Vector(object):
    def __init__(self,v,rotatable=False):
        self.value = v
        self.rotatable = rotatable

然后使用properties轻松访问值:

class Vectors(object):
    def __init__(self, v1, v2, v3):
        self.vectors = [Vector(v1),Vector(v2,rotatable=True),Vector(v3,rotatable=True)]
    @property
    def v1(self):
        return self.vectors[0].value
    @property    
    def v2(self):
        return self.vectors[1].value
    @property    
    def v3(self):
        return self.vectors[2].value
    def rotate(self, angle):
        for vector in self.vectors:
            if vector.rotatable:
                vector.value = do_rotate(vector.value, angle)

class MoreVectors(Vectors):
    def __init__(self, v4, *args, **kwargs):
        super(MoreVectors, self).__init__(*args, **kwargs)
        self.vectors.append(Vector(v4,rotatable=True))
    @property
    def v4(self):
        return self.vectors[3].value