2015-09-22 4 views
0

Scenerio - я использую парсер arg, чтобы получить аргумент командной строки auth_application.Как присвоить классу ссылочное имя строки?

auth_application команда может иметь множество значений, например:

cheese 
eggs 
noodles 
pizza 

Эти значения связаны с программируемым класса.

Я бы хотел назвать класс, возможно, используя декоратор.

Так что я могу сказать,

if auth_application is Cheese.__name__: 
    return Cheese() 

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

В любом случае, чтобы сделать это лучше? Есть ли декоратор для классов, чтобы назвать их?

Я ищу решение python 2.7, но решение python 3 может быть полезно узнать.

+1

Не могли бы вы использовать словарь типа 'classes = {'cheese': Cheese, 'eggs': Eggs}'? – TigerhawkT3

+0

Это в основном то, что у меня есть. Я пытаюсь уменьшить требуемые шаги/упростить их поддержку (меньше шагов) – visc

+0

У меня есть кортеж («сыр», «яйцо» ...) и «Букет из операторов if» – visc

ответ

0

Абсолютно вы можете! Вам нужно понять class attributes.

class NamedClass(object): 
    name = "Default" 

class Cheese(NamedClass): 
    name = "Cheese" 

print(Cheese.name) 
> Cheese 
0

Вы можете просто держать Sinlge список всех ваших «разрешенных классов» и перебирать, что найти класс именуются из командной строки.

allow_classes = [Cheese,Eggs,Noodles,Pizza] 

for cls in allow_classes: 
    if auth_application.lower() is cls.__name__.lower(): 
     return cls() 
1

Легкий peasy.

class command(object): 
    map = {} 

    def __init__(self, commandname): 
    self.name = commandname 

    def __call__(self, cls): 
    command.map[self.name] = cls 
    return cls 

    class NullCommand(object): 
    pass 

@command('cheese') 
class Cheese(object): 
    pass 

@command('eggs') 
class Eggs(object): 
    pass 

def func(auth_application): 
    return command.map.get(auth_application, command.NullCommand)() 
0

Вы можете использовать стандартные Inspect Library, чтобы получить реальные имена классов, без необходимости увеличивать свои классы с какими-либо дополнительными данными - и это работает для любого класса, в любом модуле - даже если вы не имеете исходный код.

Например - перечислить все классы, определенные в MyModule:

import mymodule 
import inspect 

for name, obj in inspect.getmembers(mymodule, inspect.isclass): 
    print name 

переменная OBJ является реальным классом объекта - который вы можете использовать, чтобы объявить экземпляр, методы класса доступа и т.д.

Чтобы получить определение класса по его имени строка - вы можете написать простую функцию поиска:

import mymodule 
import inspect 

def find_class(name): 
    """Find a named class in mymodule""" 
    for this_name, _cls_ in inspect.getmembers(mymodule, inspect.isclass): 
     if this_name = name: 
      return _cls_ 
    return None 

.... 
# Create an instance of the class named in auth_application 
find_class(auth_application)(args, kwargs) 

NB: фрагменты кода не испытанный

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