如何为类提供可引用的字符串名称?

时间:2015-09-22 03:40:04

标签: python

我已经使用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解决方案可能对我们有用。

4 个答案:

答案 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:未经过测试的代码段