关于python:如果附加了属性,如何获取类名?

How to get class name when there is attribute attached?

本问题已经有最佳答案,请猛点这里访问。

例如,

我想从以下位置返回'classname':

1
ClassName().MethodName

当我尝试时:

1
2
3
ClassName().MethodName.__class__.__name__

>>instancemethod

或者当我尝试时:

1
2
3
ClassName().MethodName.__name__

>>MethodName

也许这是不可能的,所以有一种方法可以将classname().methodname转换为classname(),这样我就可以运行它,这就是我想要的:

1
2
ClassName().__class__.__name__
>> ClassName


您需要的信息位于绑定方法对象的im_class属性中:

1
2
3
4
5
6
7
>>> class Foo():
...   def bar():
...     pass
...
>>> m = Foo().bar
>>> m.im_class
<class __main__.Foo at 0x1073bda78>

就像这样:

1
2
3
4
5
6
class Foo(object):
    def MethodName():
        pass

print type(Foo()).__name__
# Foo

或者,

1
2
3
foo=Foo()
print type(foo).__name__
# Foo

(注意——这只适用于新样式类,而不是传统类。显然,只有当您知道调用什么来实例化类时,它才有效)

如果你所拥有的只是一种方法,你可以使用inspect(thx alex martelli):

1
2
3
4
5
6
7
8
9
10
import inspect

def get_class_from_method(meth):
  for cls in inspect.getmro(meth.im_class):
    if meth.__name__ in cls.__dict__: return cls
  return None

>>> mn=Foo().MethodName
>>> get_class_from_method(mn).__name__
Foo

或者,对于用户定义的方法,可以执行以下操作:

1
2
>>> mn.im_class.__name__
Foo