我已经使用arg解析器来获取命令行参数auth_application。
auth_application
命令可以有许多值,例如:
cheese
eggs
noodles
pizza
这些值与可编程类有关。
我喜欢用类别命名的方法,可以使用装饰器。
所以我可以说
if auth_application is Cheese.__name__:
return Cheese()
目前我维护一个auth_application
名称元组,并且必须将它暴露给我的arg解析器类,并导入我需要的类。
无论如何要做得更好?是否有类的装饰器来命名它们?
我正在寻找一个python 2.7解决方案,但是python 3解决方案可能对我们有用。
答案 0 :(得分:1)
轻松自负。
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)()
答案 1 :(得分:0)
绝对可以!您需要了解class attributes。
class NamedClass(object):
name = "Default"
class Cheese(NamedClass):
name = "Cheese"
print(Cheese.name)
> Cheese
答案 2 :(得分:0)
你可以保留一份所有允许的课程列表和#34;并迭代它以查找从命令行引用的类。
allow_classes = [Cheese,Eggs,Noodles,Pizza]
for cls in allow_classes:
if auth_application.lower() is cls.__name__.lower():
return cls()
答案 3 :(得分: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:未经过测试的代码段