How to give a class a referencable string name?
scenerio是使用arg解析器获取命令行参数auth_应用程序。
1 2 3 4 | cheese eggs noodles pizza |
这些值与可编程类相关。
我想要一个命名类的方法,可以使用一个修饰器。
所以我可以说
1 2 | if auth_application is Cheese.__name__: return Cheese() |
目前,我维护一个
有什么办法能让这更好吗?是否有一个类的修饰器来命名它们?
我正在寻找一个python 2.7解决方案,但是知道python 3解决方案可能很有用。
轻松的生活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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)() |
您可以使用标准的inspect库来获取真实的类名,而不必使用任何额外的数据来扩充类——这对任何模块中的任何类都有效——即使您没有源代码也是如此。
例如-列出mymodule中定义的所有类:
1 2 3 4 5 | import mymodule import inspect for name, obj in inspect.getmembers(mymodule, inspect.isclass): print name |
obj变量是一个真正的类对象,可以用来声明实例、访问类方法等。
要通过类的名称字符串获得类的定义,可以编写一个简单的搜索函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
注意:代码段未测试
您只需保留一个所有"允许类"的sinlge列表,然后迭代该列表,从命令行中找到引用的类。
1 2 3 4 5 | allow_classes = [Cheese,Eggs,Noodles,Pizza] for cls in allow_classes: if auth_application.lower() is cls.__name__.lower(): return cls() |
当然可以!您需要了解类属性。
1 2 3 4 5 6 7 8 | class NamedClass(object): name ="Default" class Cheese(NamedClass): name ="Cheese" print(Cheese.name) > Cheese |