获得当前class的名字?

我如何得到我目前所在class级的名字?

例:

def get_input(class_name): [do things] return class_name_result class foo(): input = get_input([class name goes here]) 

由于程序的性质,我与(vistrails)接口,我不能使用__init__()来初始化input

obj.__class__.__name__会得到任何对象的名字,所以你可以这样做:

 class Clazz(): def getName(self): return self.__class__.__name__ 

用法:

 >>> c = Clazz() >>> c.getName() 'Clazz' 

在类的主体中,类名尚未定义,因此不可用。 你不能简单地inputclass级的名字吗? 也许你需要更多地谈论这个问题,所以我们可以为你find一个解决scheme。

我会创build一个元类来为你做这个工作。 它在创build类的时候被调用(概念上在类的最后部分),并且可以操作正在创build的类。 我没有testing过这个:

 class InputAssigningMetaclass(type): def __new__(cls, name, bases, attrs): cls.input = get_input(name) return super(MyType, cls).__new__(cls, name, bases, newattrs) class MyBaseFoo(object): __metaclass__ = InputAssigningMetaclass class foo(MyBaseFoo): # etc, no need to create 'input' class foo2(MyBaseFoo): # etc, no need to create 'input' 

你可以通过类的私有属性访问它:

 cls_name = self.__class__.__name__ 

编辑:

正如Ned Batcheler ,这不会在class级体内工作,但会在一个方法中。

编辑:是的,你可以; 但是您必须作弊:当前正在运行的类名称存在于调用堆栈中,并且traceback模块允许您访问堆栈。

 >>> import traceback >>> def get_input(class_name): ... return class_name.encode('rot13') ... >>> class foo(object): ... _name = traceback.extract_stack()[-1][2] ... input = get_input(_name) ... >>> >>> foo.input 'sbb' 

但是,我不会这样做; 我的原始答案仍然是我自己的偏好作为解决scheme。 原始答案:

可能最简单的方法就是使用一个装饰器,这个装饰器类似于Ned的涉及元类的回答,但function不那么强大(装饰者可以使用黑魔法,但是元类可以使用古代的,神秘的黑魔法)

 >>> def get_input(class_name): ... return class_name.encode('rot13') ... >>> def inputize(cls): ... cls.input = get_input(cls.__name__) ... return cls ... >>> @inputize ... class foo(object): ... pass ... >>> foo.input 'sbb' >>>