Python 在实例化期间,如何从范围函数变量将“id”解析为类对象?

Python 在实例化期间,如何从范围函数变量将“id”解析为类对象?,python,python-3.x,super,Python,Python 3.x,Super,我花了一上午的大部分时间在这件事上,不得不承认我被卡住了 我有一个任务,其中的核心问题是创建许多对象,每个对象都有一个标识符,该标识符应该可以从函数调用。-从概念上讲,这应该类似于SQL语句 从id>some integer;的所有对象中选择id 下面的主函数包含生成id的循环。接下来,应该使用从范围变量i获得的id创建对象。我已经看了使用,但看不到连接点的线条。你有什么好的建议吗 class aContainer(self, n): def __init__(self, n):

我花了一上午的大部分时间在这件事上,不得不承认我被卡住了

我有一个任务,其中的核心问题是创建许多对象,每个对象都有一个标识符,该标识符应该可以从函数调用。-从概念上讲,这应该类似于SQL语句

从id>some integer;的所有对象中选择id

下面的主函数包含生成id的循环。接下来,应该使用从范围变量i获得的id创建对象。我已经看了使用,但看不到连接点的线条。你有什么好的建议吗

class aContainer(self, n):
    def __init__(self, n):
        self.id = n
        #self.contains=[]

class create_object(n):
    # Completely blank 

def main()
    for i in range(10):
        create_object(i) # i is the id-tag of the object.
    # next: print list of object.id's

main()
不知道你为什么要这么做,但是

您可以修改如下内容,而不是使用dict而不是list…:

或者使用列表…,每次创建新对象时

your_list.append(blah())

然后你可以做你的列表[5:15]来获得一组对象。

Deborah在另一个论坛中解决了这个问题,如下所示:

如果ID是唯一的, 将从id到实际对象的映射存储为字典可以提供 快速的O1查找。您可以在外部将其存储为 在上述代码中或类内作为其接口的一部分:

>>> class Foo:
    instances = {}
    def __init__(self, id):
        self.id = id
        Foo.instances[id] = self # or self.instances[id], if you prefer

>>> for i in range(6): # Notice range expression used here!
    Foo(i)

<__main__.Foo object at 0x980a40c>
<__main__.Foo object at 0x981c16c>
<__main__.Foo object at 0x980ed6c>
<__main__.Foo object at 0x980eeac>
<__main__.Foo object at 0x9819f4c>
<__main__.Foo object at 0x9819b0c>
>>> Foo.instances
{0: <__main__.Foo object at 0x980a40c>, 1: <__main__.Foo object at 0x981c16c>, 2: <__main__.Foo object at 0x980ed6c>, 3: <__main__.Foo object at 0x980eeac>, 4: <__main__.Foo object at 0x9819f4c>, 5: <__main__.Foo object at 0x9819b0c>}
记住不要直接调用Fooid,除非你知道这个ID是新的

您也可以作为静态方法来执行此操作,但我对如何执行此操作已经过时了 申报那些。。。不过会更整洁

最后,如果您不关心实际的ID值是什么,那么您可以使用 idself,它保证是唯一的,并且不必在
第一位。

Jon,我对列表和字典很满意,但这里不需要这样。上述代码更广泛的方面要求递归使用列表不允许的类。所以,尽管你提出的想法很可爱,但它并不能解决问题,或者我没有抓住重点…?。好吧,TBH-我有点困惑,为什么你不能把物体传递给它们自己。。。而且,现在你才提到递归,不可否认,OP中有一些微妙的暗示,但也许有必要澄清一下,这样其他人就不会像我想的那样思考,我将把这个留在这里,让大家知道
>>> class Foo:
    instances = {}
    def __init__(self, id):
        self.id = id
        Foo.instances[id] = self # or self.instances[id], if you prefer

>>> for i in range(6): # Notice range expression used here!
    Foo(i)

<__main__.Foo object at 0x980a40c>
<__main__.Foo object at 0x981c16c>
<__main__.Foo object at 0x980ed6c>
<__main__.Foo object at 0x980eeac>
<__main__.Foo object at 0x9819f4c>
<__main__.Foo object at 0x9819b0c>
>>> Foo.instances
{0: <__main__.Foo object at 0x980a40c>, 1: <__main__.Foo object at 0x981c16c>, 2: <__main__.Foo object at 0x980ed6c>, 3: <__main__.Foo object at 0x980eeac>, 4: <__main__.Foo object at 0x9819f4c>, 5: <__main__.Foo object at 0x9819b0c>}