gpt4 book ai didi

python - 分组属性的优雅方式

转载 作者:行者123 更新时间:2023-11-28 16:50:56 25 4
gpt4 key购买 nike

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

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

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() 让我作为属性访问字典的所有项目。这对我来说已经足够干净了,但我不知道如何在方法内动态设置属性。

最佳答案

如何使 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

关于python - 分组属性的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com