获得当前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' >>>