【问题标题】:dynamic naming for instantiation [duplicate]实例化的动态命名[重复]
【发布时间】:2014-01-04 07:58:12
【问题描述】:

这是一个概念问题,我需要为网络模拟实例化多个“节点”。命名是问题 - 我需要一种方法来为实例自动生成名称(任何允许我在创建后跟踪和引用节点的方法都可以)

为了更好地了解我需要什么,这是大部分循环的样子,其中主题标签被硬塞到问题所在的位置。 x 和 y 将在父函数中定义。

    for n in range(1000):
        #n, but somehow converted into the name of the dict# = {
            'address':n,
            'resistance':x,
            'special':[],
            'parent':y,
            'children':[],
            'adjnodes':[]
    }

抱歉,我是菜鸟。我已经到处搜索了这个问题的答案,所以如果很明显,那么我就是在滥用术语或其他东西;在这种情况下,请让我知道使用什么术语,我会抓起帽子上路。不是讽刺,只是喜欢在必要时被严厉地教导。谢谢。

【问题讨论】:

  • 我没有太多要补充的,除了个人轶事——我做到了。不是这个确切的问题,但是当我们发现清除过程未正确运行时,我不得不轮询约 100 台机器并提取一些文件大小信息。我使用我正在检查的文件的名称作为每个变量,并且为了使该方法有效,我必须做的猴子扳手和 hackjob 编码是巨大的。我将不再维护该代码——如果它需要认真更新,我会从头开始重新编写它,知道我现在所知道的。听从您的回答者的建议:将数据保留在您的变量之外。
  • 这就是 PHP 优于 python 的原因:php.net/manual/en/language.variables.variable.php(开个玩笑,请投反对票而不是无知:-)
  • @vincent:不,Tcl 优于两者。 eval 是做所有事情的一种真正方法,因此您不必记住任何花哨、高效或安全的东西,因为不存在这样的东西。 :)

标签: python oop instantiation factory


【解决方案1】:

听起来您正在尝试将这些变量创建为一堆单独的变量,然后将变量的名称存储在每个变量的 address 字段中。

不要那样做。请参阅 Keep data out of your variable namesWhy you don't want to dynamically create variables 了解原因。但简短的版本是,尝试这样做是您首先遇到问题的唯一原因。

为什么不只创建一个包含所有节点的list?那么您的address 可以只是该列表的索引。例如:

nodes = []
for n in range(1000):
    nodes.append({
        'address':n,
        'resistance':x,
        'special':[],
        'parent':y,
        'children':[],
        'adjnodes':[]
    })

或者,如果您打算在进行过程中添加和删除节点,因此列表索引不会保持一致,只需使用 dict

nodes = {}
for n in range(1000):
    nodes[n] = {
        'address':n,
        'resistance':x,
        'special':[],
        'parent':y,
        'children':[],
        'adjnodes':[]
    }

【讨论】:

  • 本来想问这个,但在别处找到了。想知道使用特定于节点的函数和类。这家伙有一个超级巧妙的答案stackoverflow.com/questions/1208322/dictionary-with-classesshapes = {'1':Square, '2':Circle, '3':Triangle} # 只是字典中的类名 x = shapes[raw_input()]() #从 dict 中获取类,然后调用它来创建一个形状实例。
【解决方案2】:

如果n 有意义,您可以将每个dicts 放入另一个dict,并以n 为键。

如果n 没有意义,只需将那些dicts 添加到list

无论哪种方式,都应将数据保留在变量名之外。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2014-10-09
    相关资源
    最近更新 更多