Доступ к экземпляру класса «имя» динамически в Python - PullRequest
1 голос
/ 29 апреля 2010

Говоря простым языком: я создаю экземпляры класса динамически в цикле 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

Как мне создать идентификатор для этих экземпляров, чтобы к ним позже можно было обращаться по «имени»?

Я нашел способ получить это, связав «имя» с местом в памяти:

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 дня, чтобы найти ответ, который не существует. У кого-нибудь есть что-нибудь?

Заранее спасибо, Andy

Обновление: коллега только что показал мне, что он думает, что это самый простой способ, а именно создать реальный словарь экземпляров класса, используя экземпляр "имя" в качестве ключа.

Ответы [ 3 ]

3 голосов
/ 29 апреля 2010

Иногда лучше всего сохранять простоту. Наличие указания, в котором ваши экземпляры хранятся с именами в качестве ключей, будет простым и довольно простым в реализации.

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

и затем, чтобы получить подходящий экземпляр, просто ...

instance = A.instances[name]
2 голосов
/ 29 апреля 2010

Нет необходимости помещать экземпляр dict в класс. Просто создайте 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
1 голос
/ 29 апреля 2010

Да, словарный подход должен хорошо работать и может быть согласован с самим классом.

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.

Это немного сложно, поэтому я предоставлю вам возможность исследовать (и, конечно, задать другой вопрос по SO, если вы застряли).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...