如何获取当前类的名称?
我怎么才能获取我当前所在的类的名字呢?
举个例子:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
因为我正在使用的程序(vistrails)的特性,我不能用 __init__()
来初始化 input
。
9 个回答
24
在一个类的内部,类的名字还没有被定义,所以你不能直接使用它。你不能简单地输入类的名字吗?也许你需要多说一些关于你遇到的问题,这样我们才能帮你找到解决办法。
我会创建一个元类来帮你完成这个工作。元类在类创建的时候被调用(可以理解为在类的最后部分),它可以对正在创建的类进行一些操作。我还没有测试过这个:
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'
27
PEP 3155 引入了 __qualname__
这个概念,它是在 Python 3.3 中实现的。
对于顶层的函数和类,
__qualname__
属性和__name__
属性是一样的。对于嵌套的类、方法和函数,__qualname__
属性则包含了一个从模块顶层到这个对象的点分路径。
你可以在类或函数的定义内部访问这个属性,比如:
class Foo:
print(__qualname__)
这段代码会打印出 Foo
。你会得到一个完整的名称(不包括模块的名称),所以你可能需要用 .
字符来分割它。
不过,实际上并没有办法直接获取正在定义的类的引用。
>>> class Foo:
... print('Foo' in globals())
...
False
193
obj.__class__.__name__
这个写法可以让你获取任何对象的名字,所以你可以这样做:
class Clazz():
def getName(self):
return self.__class__.__name__
用法:
>>> c = Clazz()
>>> c.getName()
'Clazz'