Python 计算运行时使用的属性
我正在从事一个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 = []
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
属性\u add
要多,在将元素添加到向量之前,对元素执行一些其他操作,如归一化和bool->int
转换SIZE
目前的状态是一个真正的常量。它只在VectorBuilder
的第一行中给出一个值,并且在运行时从未更改。我意识到我没有在主要文章中正确地阐明这一点,但在运行时从未添加新属性。我所说的调整将在编程时进行。例如,如果我想添加一个新属性,我需要在build
函数中添加它,例如:
self._add(self.fd.getCharacter().getAction().getActionData().getSpeed())
,以及将SIZE
定义更改为SIZE=6
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
您应该可以访问。我觉得您的方法有点复杂。