附加属性时如何获取类名?

时间:2014-05-05 22:31:54

标签: python class methods

例如,

我想要返回' ClassName'来自以下内容:

ClassName().MethodName

当我尝试:

ClassName().MethodName.__class__.__name__

>>instancemethod

或当我尝试:

ClassName().MethodName.__name__

>>MethodName

也许这是不可能的,所以有没有办法将ClassName()。MethodName转换为ClassName(),所以我可以运行它,这就是我想要的:

ClassName().__class__.__name__
>> ClassName

2 个答案:

答案 0 :(得分:3)

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

>>> class Foo():
...   def bar():
...     pass
...
>>> m = Foo().bar
>>> m.im_class
<class __main__.Foo at 0x1073bda78>

答案 1 :(得分:2)

像这样:

class Foo(object):
    def MethodName():
        pass

print type(Foo()).__name__ 
# Foo

或者,

foo=Foo()
print type(foo).__name__
# Foo

(注意 - 这只适用于新的样式类,而不适用于遗留类。显然只有在知道调用实例化类的方法时才有效)

如果您只拥有方法,则可以使用inspect(Thx Alex Martelli):

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

或者,对于user defined method,您可以执行以下操作:

>>> mn.im_class.__name__
Foo