Python 计算运行时使用的属性

Python 计算运行时使用的属性,python,python-3.x,dynamic,attributes,getattr,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 = []

我正在从事一个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)
访问大小,我只需要编辑
属性
,但我不知道如何使这种方法与链式函数调用一起工作,例如
self.fd.getCharacter().getCharacterData()

有没有更干净的方法来完成我想做的事情

编辑: 需要一些补充信息和澄清

  • 由于我在网上读到一些不好的建议,我使用了
    \uuuu
    (基本上是说我应该对模块私有成员使用
    \uu
    ,对类私有成员使用
    \uuu
    )。我现在已经将它们编辑为
    \uuu
    属性
  • getter是我正在使用的框架的一部分
  • 向量存储为私有类成员,因此我不必在构造方法中传递它,实际上,构造方法比简单的
    \u add
    要多,在将元素添加到向量之前,对元素执行一些其他操作,如归一化和
    bool->int
    转换
  • SIZE
    目前的状态是一个真正的常量。它只在
    VectorBuilder
    的第一行中给出一个值,并且在运行时从未更改。我意识到我没有在主要文章中正确地阐明这一点,但在运行时从未添加新属性。我所说的调整将在编程时进行。例如,如果我想添加一个新属性,我需要在
    build
    函数中添加它,例如:

    self._add(self.fd.getCharacter().getAction().getActionData().getSpeed())
    
    ,以及将
    SIZE
    定义更改为
    SIZE=6

  • 这些属性被编译成当前一个简单的python列表(但可能会被numpy数组取代),然后作为输入向量传递到神经网络。然而,首先需要建立神经网络本身,这发生在任何数据可用之前(即,在创建任何输入向量之前)。但是,为了成功构建,神经网络需要知道它将接收的输入向量的大小。这就是为什么
    SIZE
    是必要的,也是
    assert
    语句的原因-以确定我传递给网络的向量实际上就是我声称要传递给它的大小

  • 我知道代码是非音速的,这就是为什么我在这里-代码工作,它只是丑陋。

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


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

    为什么要使用
    \u
    属性?为什么要将值存储在列表中,而不是作为普通属性,或者至少存储在dict中?首先,为什么需要像
    getCharacter()
    这样的getter?为什么向量会存储在任何地方,而当你唯一一次访问它时,它会用一个你立即返回的全新值来替换它?
    断言
    实际上是为了保护什么?你试图做的每一件事似乎都过于复杂和不和谐,在不知道原因的情况下,很难说它的一个特定元素是否因为约定属性而特别复杂,因为约定属性的名称都是大写字母,比如
    SIZE
    意味着它是一个永远不会改变的常量,但是你提到了“调整
    SIZE
    变量”。如果您要编写Python代码,我强烈建议您阅读(及以下内容)建议。最后,正如@abarneart所说的,去掉属性名称上的前缀
    \uuuuu
    ,在这里只需一个简单的
    \uuu
    来表示私有的东西就足够了。@martineau我认为这意味着
    大小
    应该在类创建时创建(大概是通过一些模块级代码,因为我怀疑他会仅仅为此使用元类…但你永远不知道…)然后再也不会更改。如果是这样,它实际上是一个常量。例如,如果他使用的是一个普通的
    \uuuuuu slots\uuu
    类,他可以编写一个简单的修饰符来设置
    cls.SIZE=len(cls.\uu slots\uu)
    ,即使从技术上讲它是在
    类型
    调用返回后赋值的,你仍然会调用它,对吗?我编辑了OP,试图回答上面评论中提出的问题。我需要
    大小
    ,然后才能访问这些值。好的。但同时你选择输入变量,
    SIZE
    您应该可以访问。我觉得您的方法有点复杂。