2013-11-27 2 views
0

При написании программы Python (2.5) я попытался создать класс и в своей функции __init__ автоматически создать экземпляр другого класса с его именем в качестве аргумента для __init__ функция, что-то вроде этого:Python: как автоматически создать экземпляр в другом классе

class Class1: 
     def __init__(self,attribute): 
      self.attribute1=attribute 

    class Class2: 
     def __init__(self,instanceName): 
      #any of Class2's attributes 
      exec instanceName + '=Class1('attribute1')' 
      # this should produce an instance of Class1 whose name is instanceName 

Но когда я делаю экземпляр Class2, instance=Class2('instance2'), и попытаться получить attribute1 из instance2 (который должен быть создан из __init__ функции class2 в) я получаю сообщение об ошибке:

Traceback (most recent call last): 
     File "<pyshell#29>", line 1, in <module> 
     print instance2.attribute1 
    NameError: name 'instance2' is not defined 

Я не знаю, в чем проблема, так как name='instance3' и exec name+'=Class1('attribute1') действительно работает, хотя это, вероятно, потому, что у меня нет большого опыта работы с Python. Как я смогу сделать что-то подобное автоматически при создании экземпляра?

+0

В Python 2, не ваши классы продлить 'object'? –

+0

Что именно вы пытаетесь сделать? Я уверен, что есть способ сделать то, что вы хотите, что не связано с этой структурой. –

+0

Похоже на проблему XY - почему у вас есть требование назначить экземпляр для определенного имени? И сейчас вы пытаетесь создать его как локальную переменную, что мало смысла, поскольку доступно только в локальной области. Каков ваш прецедент? – l4mpi

ответ

1

я должен бежать, так что, надеюсь, кто-то может исправить любые ошибки в этом посте:

class Class1: 
    def __init__(self, attribute): 
    self.attribute1 = attribute 

class Class2: 
    def __init__(self, instanceName): 
    setattr(self, instanceName, Class1(...)) # replace ... with whatever parameters you want 
+0

Это 'setattr (self, instanceName, class1 ('attribute text'))', похоже, работает, что делает instanceName глобальным экземпляром класса1. – user2360589

+0

Хотя это сработало в примере, который я дал, у меня получилось такое же сообщение об ошибке «NameError: name« instance2 »не определено», когда я включил его в более сложную программу, с которой я работал. – user2360589