在Python中动态访问类实例“name”

时间:2010-04-28 22:35:28

标签: python

简单来说:我在for循环中动态创建类实例,然后该类为实例定义了一些属性。我需要以后能够在另一个for循环中查找这些值。

示例代码:

class A:
    def __init__(self, name, attr):
        self.name=name
        self.attr=attr

names=("a1", "a2", "a3")
x=10
for name in names:
    name=A(name, x)
    x += 1
...
...
...
for name in names:
    print name.attr

如何为这些实例创建标识符,以便稍后可以通过“名称”访问它们?

通过将“name”与内存位置相关联,我找到了一种方法:

class A:
    instances=[]
    names=[]
    def __init__(self, name, attr):
        self.name=name
        self.attr=attr
        A.instances.append(self)
        A.names.append(name)

names=("a1", "a2", "a3")
x=10
for name in names:
    name=A(name, x)
    x += 1
...
...
...
for name in names:
    index=A.names.index(name)
    print "name:  " + name
    print "att:  " + str(A.instances[index].att)

这让我在网上搜索了2天,但我找不到答案。也许我不知道如何正确地提出问题,或者可能无法完成(正如许多其他帖子似乎在暗示)。

现在第二个例子有效,现在我将使用它。我只是认为必须有一个比创建自己的索引号码临时字典更简单的方法,我希望我不浪费2天寻找不存在的答案。有人有什么?

提前致谢, 安迪

更新:一位同事刚刚向我展示了他认为最简单的方法,那就是使用实例“name”作为密钥来创建一个实际的类实例字典。

3 个答案:

答案 0 :(得分:3)

有时保持简单是最好的。使用以名称作为键存储实例的dict既简单又容易实现。

class A:
    instances={}
    def __init__(self, name, attr):
        self.name=name
        self.attr=attr
        A.instances[name] = self

然后获得正确的实例,只是......

instance = A.instances[name]

答案 1 :(得分:2)

无需将实例dict放在类中。只需在本地范围内创建一个字典inst

class A:
    def __init__(self, name, attr):
        self.name=name
        self.attr=attr

inst={}
names=("a1", "a2", "a3")
x=10
for name in names:
    inst[name]=A(name, x)
    x += 1

然后,只要您想按名称访问某个实例,只需使用inst[name]

for name in names:
    print inst[name].attr

答案 2 :(得分:1)

是的,字典方法应该运作良好,并且可以与课程本身相吻合。

class A:
    _instances = {}

    @classmethod
    def get(cls, name):
        return A._instances[name]

    def __init__(self, name, attr):
        self.name=name
        self.attr=attr
        A._instances[name] = self

a = A('foo', 10)
aa = A.get('foo')

如果您想使用__new__,您甚至可以使其透明:

a = A('foo', 10)
aa = A('foo') # 'a' and 'aa' refer to the same instance.

这有点复杂,所以我会留给你研究(如果你遇到困难,当然会问另一个问题)。