Python 有没有迭代__u插槽并动态赋值的方法?

Python 有没有迭代__u插槽并动态赋值的方法?,python,slots,Python,Slots,我正在为一个基于代理的模型创建一个框架,我有一个叫做代理的类。由于模拟中将有数千个代理,我想使用_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,它将替换默认的uuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我对代码进行了结构化,以便它从数据表中获取代理的参数,并且我希望将存储在表中的值分配给具有表头名称的属性 如果以下是数据表 | agent_name | location | attr1 | at

我正在为一个基于代理的模型创建一个框架,我有一个叫做代理的类。由于模拟中将有数千个代理,我想使用_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方法,但我觉得这并不干净,我觉得应该有更好的方法。我想知道是否有一种方法可以遍历插槽并为每个属性赋值。

一些指针:

# 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这是一个优雅的解决方案,比将其包装在函数中要好。谢谢,这是一个很好的回答。