如何获取当前类的名称?

128 投票
9 回答
142218 浏览
提问于 2025-04-16 22:53

我怎么才能获取我当前所在的类的名字呢?

举个例子:

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'

撰写回答