我正在研究一个python项目,该项目需要我将某些对象的某些属性编译到数据集中。我当前正在使用的代码如下:
class VectorBuilder(object):
SIZE = 5
def __init__(self, player, frame_data):
self.player = player
self.fd = frame_data
def build(self):
self._vector = []
self._add(self.player)
self._add(self.fd.getSomeData())
self._add(self.fd.getSomeOtherData())
char = self.fd.getCharacter()
self._add(char.getCharacterData())
self._add(char.getMoreCharacterData())
assert len(self._vector) == self.SIZE
return self._vector
def _add(self, element):
self._vector.append(element)
但是,此代码有点不干净,因为向数据集中添加属性或从数据集中删除属性也需要正确调整SIZE
变量。我什至拥有SIZE
变量的原因是,在创建数据集本身之前,需要在运行时知道数据集的大小。
我曾经考虑过保留所有用于将数据集构造为字符串的函数的列表(如attributes = ['getPlayer', 'fd.getSomeData', ...]
),然后将build
函数定义为:
def build(self):
self._vector = []
for att in attributes:
self._vector.append(getattr(self, att)())
return self._vector
这将使我可以像访问len(attributes)
一样简单地访问大小,而我只需要编辑attributes
,但是我不知道如何使这种方法与链式函数调用一起使用,例如self.fd.getCharacter().getCharacterData()
。
有没有一种更清洁的方式来完成我要尝试的工作?
一些其他信息和澄清是必要的。
__
(本质上说,对于模块私有成员,我应该使用_
,对于类私有成员,我应该使用__
)。我现在已经将它们编辑为_
属性。_add
还要多,它还可以进行标准化和{{ 1}}进行元素转换,然后再将其添加到向量中。 bool->int
是一个真正的常量。它只会在SIZE
的第一行中被赋予一个值,并且在运行时不会改变。我意识到我没有在主要帖子中适当地阐明这一点,但是永远不会在运行时添加新属性。我所说的调整将在编程时进行。例如,如果要添加新属性,则需要在VectorBuilder
函数中添加它,例如:
build
,并将self._add(self.fd.getCharacter().getAction().getActionData().getSpeed())
的定义更改为SIZE
。
SIZE = 6
是必要的原因,也是SIZE
语句的原因-确定我传递给网络的向量实际上是我声称要传递给它的大小的原因。 / li>
我知道代码是非Python的,这就是为什么我在这里-代码有效,只是丑陋。
答案 0 :(得分:0)
您不想从列表中提供属性的字符串,而是要从中创建输入参数,为什么不使用包含所有内容的列表来初始化build
函数您的getter函数返回的值?
例如,您的SIZE
变量仍将是build(self,*args)
中提供的动态参数列表的长度。