如何以字符串形式获取具体类名?

195
我想避免频繁调用 isinstance() 函数,因此我正在寻找一种以字符串形式获取实例变量具体类名的方法。
有什么想法吗?

2
这不是一个让我来到这里的问题的副本。我正在阅读Python 3的“Concrete Objects Layer”文档。该文档描述了与普通类名低级别的类型的C级别映射。因此,例如,文档描述了一个“PyLongObject”。我想知道如何在给定任意对象的情况下获取这个低级别名称。 - Tom Stambaugh
3个回答

341
 instance.__class__.__name__

例子:

>>> class A():
    pass
>>> a = A()
>>> a.__class__.__name__
'A'

79
我更喜欢:type(instance).__name__ - Chris
5
如果你不想实例化这个类,你能否仅仅获取这个类的名称?(不通过对象获取) - Gabriel
48
使用以下代码获取类A的名称:A.__name__ - bk0
2
有没有一种方法可以通过导入路径获取它?例如,str(type(foo)) == "<class 'never.gonna.give.youup'>" 但是 type(foo).__name__ == "youup"。我该如何获得 never.gonna.give.youup - Martin Thoma
1
对于路径,您可以使用type(foo).__module__。 - xyxel

33
<object>.__class__.__name__

9
您也可以创建一个字典,将类本身作为键,而不一定是类名。
typefunc={
    int:lambda x: x*2,
    str:lambda s:'(*(%s)*)'%s
}

def transform (param):
    print typefunc[type(param)](param)

transform (1)
>>> 2
transform ("hi")
>>> (*(hi)*)

这里的typefunc是一个字典,它为每种类型映射一个函数。transform获取该函数并将其应用于参数。

当然,使用“真正的”面向对象编程会更好。


+1. 对于类对象本身的“is”测试比字符串更快,并且不会因为两个不同的类被称为相同的名称而出错。 - bobince
遗憾的是,这在子类中无法实现,但对于“真正”的面向对象编程和多态性的提示加一分。 - Torsten Marek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接