0

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

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

“从id > some integer的所有对象中选择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()
4

2 回答 2

0

不知道你为什么要这样做,但是......

您可以调整如下内容(不使用 a dictnot a 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]一组对象。

于 2012-07-16T11:26:15.827 回答
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。

于 2012-07-18T15:50:27.680 回答