在运行时计算使用的属性

时间:2018-07-03 19:56:07

标签: python python-3.x dynamic attributes getattr

我正在研究一个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()

有没有一种更清洁的方式来完成我要尝试的工作?

编辑:

一些其他信息和澄清是必要的。

  1. 由于我在网上阅读了一些错误的建议,我之所以使用__(本质上说,对于模块私有成员,我应该使用_,对于类私有成员,我应该使用__)。我现在已经将它们编辑为_属性。
  2. 吸气剂是我正在使用的框架的一部分。
  3. 向量存储为私有类成员,因此我不必将其传递给构造方法,实际上这些构造方法比简单的_add还要多,它还可以进行标准化和{{ 1}}进行元素转换,然后再将其添加到向量中。
  4. 当前,
  5. bool->int是一个真正的常量。它只会在SIZE的第一行中被赋予一个值,并且在运行时不会改变。我意识到我没有在主要帖子中适当地阐明这一点,但是永远不会在运行时添加新属性。我所说的调整将在编程时进行。例如,如果要添加新属性,则需要在VectorBuilder函数中添加它,例如:

    build

    ,并将self._add(self.fd.getCharacter().getAction().getActionData().getSpeed()) 的定义更改为SIZE

  6. 将属性编译为当前简单的python列表(但可能会被numpy数组替换),然后作为输入向量传入神经网络。但是,神经网络本身需要首先构建,并且这需要在任何数据可用之前(即在创建任何输入矢量之前)进行。为了成功构建,神经网络需要知道它将要接收的输入向量的大小。这就是为什么SIZE = 6是必要的原因,也是SIZE语句的原因-确定我传递给网络的向量实际上是我声称要传递给它的大小的原因。 / li>

我知道代码是非Python的,这就是为什么我在这里-代码有效,只是丑陋。

1 个答案:

答案 0 :(得分:0)

您不想从列表中提供属性的字符串,而是要从中创建输入参数,为什么不使用包含所有内容的列表来初始化build函数您的getter函数返回的

例如,您的SIZE变量仍将是build(self,*args)中提供的动态参数列表的长度。