关于python:如何给类一个可引用的字符串名?

How to give a class a referencable string name?

scenerio是使用arg解析器获取命令行参数auth_应用程序。

auth_application命令可以有许多值,例如:

1
2
3
4
cheese
eggs
noodles
pizza

这些值与可编程类相关。

我想要一个命名类的方法,可以使用一个修饰器。

所以我可以说

1
2
if auth_application is Cheese.__name__:
    return Cheese()

目前,我维护一个auth_application名称的元组,必须将其公开给arg解析器类,并导入我需要的类。

有什么办法能让这更好吗?是否有一个类的修饰器来命名它们?

我正在寻找一个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