Python 有没有迭代__u插槽并动态赋值的方法?
我正在为一个基于代理的模型创建一个框架,我有一个叫做代理的类。由于模拟中将有数千个代理,我想使用_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,它将替换默认的uuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我对代码进行了结构化,以便它从数据表中获取代理的参数,并且我希望将存储在表中的值分配给具有表头名称的属性 如果以下是数据表 | agent_name | location | attr1 | attr2 | |--------------|------------|-------------|------------| | agent smith | NY | some value | some value | | Neo | NY | some value | some value | | Morpheus | Zion | some value | some value | 我知道你可以在for循环中使用.eval方法,但我觉得这并不干净,我觉得应该有更好的方法。我想知道是否有一种方法可以遍历插槽并为每个属性赋值。一些指针:Python 有没有迭代__u插槽并动态赋值的方法?,python,slots,Python,Slots,我正在为一个基于代理的模型创建一个框架,我有一个叫做代理的类。由于模拟中将有数千个代理,我想使用_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,它将替换默认的uuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我对代码进行了结构化,以便它从数据表中获取代理的参数,并且我希望将存储在表中的值分配给具有表头名称的属性 如果以下是数据表 | agent_name | location | attr1 | at
# illustration of what I want
header_of_table = ["agent_name", "location", "attr1", "attr2"]
class agent:
__slots__ = header_of_table
def __init__(self, values_in_row):
# what I ideally want, I know this syntax doesnt work, but this is to get the idea across
for slotted_attribute, value in zip(self.__slots__, values_in_row):
self.slotted_attribute = value
- 使用
\uuuu插槽时,需要从
对象继承。 Python 2
- 类应始终大写
- 正如Michael在评论中所写,您可以使用
setattr
- 它被称为
而不是\uuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuu
# illustration of what I want
header_of_table = ["agent_name", "location", "attr1", "attr2"]
class Agent:
__slots__ = header_of_table
def __init__(self, values_in_row):
for i, slot in enumerate(self.__slots__):
self.__setattr__(slot, values_in_row[i])
agent = Agent(["foo", "bar", "yellow", "green"])
print(agent.agent_name, agent.location, agent.attr1, agent.attr2)
>>> foo bar yellow green
编辑评论:
如果我理解正确的话,我会这样做以避免污染全球范围
slotheaders.py:
class SlotHeaders:
__slots__ = ["agent_name", "location", "attr1", "attr2"]
agent.py:
from slotheaders import SlotHeaders
class Agent(SlotHeaders):
def __init__(self, values_in_row):
for i, slot in enumerate(self.__slots__):
self.__setattr__(slot, values_in_row[i])
agent = Agent(["foo", "bar", "yellow", "green"])
print(agent.agent_name, agent.location, agent.attr1, agent.attr2)
几点建议:
- 使用
\uuuu插槽时,需要从
对象继承。 Python 2
- 类应始终大写
- 正如Michael在评论中所写,您可以使用
setattr
- 它被称为
而不是\uuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuu
# illustration of what I want
header_of_table = ["agent_name", "location", "attr1", "attr2"]
class Agent:
__slots__ = header_of_table
def __init__(self, values_in_row):
for i, slot in enumerate(self.__slots__):
self.__setattr__(slot, values_in_row[i])
agent = Agent(["foo", "bar", "yellow", "green"])
print(agent.agent_name, agent.location, agent.attr1, agent.attr2)
>>> foo bar yellow green
编辑评论:
如果我理解正确的话,我会这样做以避免污染全球范围
slotheaders.py:
class SlotHeaders:
__slots__ = ["agent_name", "location", "attr1", "attr2"]
agent.py:
from slotheaders import SlotHeaders
class Agent(SlotHeaders):
def __init__(self, values_in_row):
for i, slot in enumerate(self.__slots__):
self.__setattr__(slot, values_in_row[i])
agent = Agent(["foo", "bar", "yellow", "green"])
print(agent.agent_name, agent.location, agent.attr1, agent.attr2)
这里有一个“setattr”。应该读一下:它说,例如,您的类需要从
对象继承。另外,它不是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我替换了所有这些输入错误。这里有“setattr”。应该读一下:它说,例如,您的类需要从对象继承。另外,它不是\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我替换了所有这些输入错误。从对象
继承只是Python 2中的一件事。在Python3中,这是自动发生的,除非需要与Python2向后兼容,否则不需要指定它(现在可能没有)。我从编辑器复制了粘贴,所以我没有注意到我忘记了将类名大写,感谢您指出,我会确保更正它。@Mandera我对当前的答案很满意,但是行的头\u
在全局范围内,如果我想限制范围,那么我需要将代理类嵌套在可以存储行的头\u
的函数中。此元函数的目的仅是将行的标题分配给\uuuu插槽\uuu
。这是我唯一能想到的限制范围的方法,有没有更好的方法将变量分配给\uuuuuu slots\uuuuu
?或者我应该创建一个新问题,因为它与原始问题不同?@KukaiNakahata编辑了我的答案,你认为如何?@Mandera这是一个优雅的解决方案,比将其包装在函数中要好。谢谢,这是一个很好的答案。从object
继承只是Python 2中的一件事。在Python3中,这是自动发生的,除非需要与Python2向后兼容,否则不需要指定它(现在可能没有)。我从编辑器复制了粘贴,所以我没有注意到我忘记了将类名大写,感谢您指出,我会确保更正它。@Mandera我对当前的答案很满意,但是行的头\u
在全局范围内,如果我想限制范围,那么我需要将代理类嵌套在可以存储行的头\u
的函数中。此元函数的目的仅是将行的标题分配给\uuuu插槽\uuu
。这是我唯一能想到的限制范围的方法,有没有更好的方法将变量分配给\uuuuuu slots\uuuuu
?或者我应该创建一个新问题,因为它与原始问题不同?@KukaiNakahata编辑了我的答案,你认为如何?@Mandera这是一个优雅的解决方案,比将其包装在函数中要好。谢谢,这是一个很好的回答。