我想对一个类的实例的属性进行分组,这样就可以很容易地遍历属于一个组的所有属性。显而易见的答案是将所有这些放入列表或字典中,但后来我无法将它们作为我的对象的属性来访问,我宁愿这样做。
有些代码应该清楚我想要的内容。在这里,我实际上有一个列表和真实的属性。
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()
让我访问字典中的所有项目作为属性。这对我来说足够干净,但我不知道如何在方法中动态设置属性。
答案 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