如果我所使用的函数是派生了实例类的基类,那么我如何查找在Python中创建对象实例的类的名称呢?
我在想也许是inspect模块帮了我,但它似乎没有给我想要的。除了解析
您是否尝试过该类的
1 2 3 4 | >>> import itertools >>> x = itertools.count(0) >>> type(x).__name__ 'count' |
这种方法只适用于新样式的类。您的代码可能使用一些老式的类。以下方法对两者都适用:
1 | x.__class__.__name__ |
要将类的名称作为字符串吗?
1 | instance.__class__.__name__ |
类型()?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | >>> class A(object): ... def whoami(self): ... print type(self).__name__ ... >>> >>> class B(A): ... pass ... >>> >>> >>> o = B() >>> o.whoami() 'B' >>> |
1 2 3 4 5 | class A: pass a = A() str(a.__class__) |
上面的示例代码(在交互解释器中输入时)将生成
1 | "{0}.{1}".format(a.__class__.__module__,a.__class__.__name__) |
如果在单独的模块中定义了具有相同名称的类,则此行为更为可取。
上面提供的示例代码是在Python 2.7.5中测试的。
1 2 3 4 5 6 7 | type(instance).__name__ != instance.__class__.__name #if class A is defined like class A(): ... type(instance) == instance.__class__ #if class A is defined like class A(object): ... |
例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | >>> class aclass(object): ... pass ... >>> a = aclass() >>> type(a) <class '__main__.aclass'> >>> a.__class__ <class '__main__.aclass'> >>> >>> type(a).__name__ 'aclass' >>> >>> a.__class__.__name__ 'aclass' >>> >>> class bclass(): ... pass ... >>> b = bclass() >>> >>> type(b) <type 'instance'> >>> b.__class__ <class __main__.bclass at 0xb765047c> >>> type(b).__name__ 'instance' >>> >>> b.__class__.__name__ 'bclass' >>> |
好问题。
下面是一个基于GHZ的简单例子,它可能会帮助一些人:
1 2 3 4 5 6 7 8 | >>> class person(object): def init(self,name): self.name=name def info(self) print"My name is {0}, I am a {1}".format(self.name,self.__class__.__name__) >>> bob = person(name='Robert') >>> bob.info() My name is Robert, I am a person |
或者你可以使用
1 2 3 4 5 6 7 | class A: @classmethod def get_classname(cls): return cls.__name__ def use_classname(self): return self.get_classname() |
用法:
1 2 3 4 5 6 7 | >>> A.get_classname() 'A' >>> a = A() >>> a.get_classname() 'A' >>> a.use_classname() 'A' |
除了获取特殊的
在大多数情况下,它们是完全相同的,但是,当处理嵌套类/方法时,它们在您得到的输出中是不同的。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Spam: def meth(self): pass class Bar: pass >>> s = Spam() >>> type(s).__name__ 'Spam' >>> type(s).__qualname__ 'Spam' >>> type(s).Bar.__name__ # type not needed here 'Bar' >>> type(s).Bar.__qualname__ # type not needed here 'Spam.Bar' >>> type(s).meth.__name__ 'meth' >>> type(s).meth.__qualname__ 'Spam.meth' |
因为自省是你所追求的,所以这也是你应该考虑的。