2014-01-10 4 views
1

Скажем, у нас есть питон файл:питон, как создавать классы в одном файле динамически с именем

class A(object): 
    def say_hi(self): 
     print('hi, I am A') 


class B(object): 
    def say_hi(self): 
     print('hi, I am B') 


class F(object): 
    def __init__(self, name): 
     self.name = name 

    def create(self): 
     return ## ??? 


if __name__ == '__main__': 
    f = F('B') 
    b = f.create() 
    b.say_hi() 

И я хочу создать экземпляр класса с его именем. Каким должен быть код в файле F.create()?

+2

'Глобалы() [self.name]()'? – falsetru

+0

@ thefourtheye well, Если я передаю 'A', я хочу 'A()' if 'B', а затем 'B()'. – mitnk

+0

@DSM, потому что мне нужно создать базу экземпляров в файле конфигурации, в котором указывается имя класса. – mitnk

ответ

3

Использование globals:

>>> class A(object): 
...  def say_hi(self): 
...   print('hi, I am A') 
... 
>>> class B(object): 
...  def say_hi(self): 
...   print('hi, I am B') 
... 
>>> class F(object): 
...  def __init__(self, name): 
...   self.name = name 
...  def create(self): 
...   return globals()[self.name]() 
... 
>>> 
>>> f = F('B') 
>>> b = f.create() 
>>> b.say_hi() 
hi, I am B 
+0

Спасибо. Я всегда думаю, что это зло для использования 'globals' или' locals' в python. Так это вообще не зло (по крайней мере, в коде здесь)? – mitnk

+0

@mitnk, менее злой, чем 'eval',' exec' ... – falsetru

+1

@mitnk, Если вы хотите ограничить имя 'A',' B', используйте что-то вроде '{'A': A, 'B' : B} [self.name]() '. – falsetru

Смежные вопросы