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

时间:2012-07-16 10:57:23

标签: python python-3.x super

早上大部分时间都花在这个上面,不得不承认我被困住了。

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

“从所有对象中选择 id ,其中 id>某个整数;”。

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

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()

2 个答案:

答案 0 :(得分:0)

不确定您为什么要这样做,但是......

您可以调整以下内容(不是使用dict而不是list)...:

from itertools import count
next_id = count(0)

id_to_object = {}

class blah(object):
    pass

for i in xrange(10):
    id_to_object[next(next_id)] = blah()

for i in xrange(25):
    id_to_object[next(next_id)] = blah()

for k, v in id_to_object.iteritems():
    if k > 5:
        print v

或者使用列表...,每次创建对象...

your_list.append(blah())

然后你可以your_list[5:15]来获得一组对象。

答案 1 :(得分:0)

“Deborah”在另一个论坛中解决了以下问题:

如果ID是唯一的, 存储从id到实际对象的映射作为字典给你一个 快速(基本上是O(1))查找。您可以将其存储在外部(如 在上面的代码中)或在类中作为其接口的一部分:

>>> 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>}

(并且记住不要直接调用Foo(id),除非你知道ID是新的!)

(您也可以将此作为静态方法,但我已经过时了 宣布那些......但它会更整洁)

最后,如果您不关心实际ID值是什么,那么您可以使用 id(self),保证唯一,而不必传入ID 第一名。