附加属性时如何获取类名? [复制]

Posted

技术标签:

【中文标题】附加属性时如何获取类名? [复制]【英文标题】:How to get class name when there is attribute attached? [duplicate] 【发布时间】:2014-06-22 09:02:39 【问题描述】:

例如,

我想从以下返回“ClassName”:

ClassName().MethodName

当我尝试时:

ClassName().MethodName.__class__.__name__

>>instancemethod

或者当我尝试时:

ClassName().MethodName.__name__

>>MethodName

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

ClassName().__class__.__name__
>> ClassName

【问题讨论】:

repr(method_name).rpartition('.')[-1].split()[0] 【参考方案1】:

你要的信息在绑定方法对象的im_class属性中:

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

【讨论】:

【参考方案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

【讨论】:

这似乎没有回答OP的问题,它给出了一个方法,如何获取类的名称 我仍然收到instancemethod 立即尝试(使用最后两种方法。)这是新式还是旧式类?

以上是关于附加属性时如何获取类名? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将具体的类名作为字符串获取? [复制]

如何获取调用我的方法的类名? [复制]

如何在 Angular 中获取数据模型的类名? [复制]

如何从属性内部获取类名(这又是某种类型的对象)

如何获取包中的所有类名? [复制]

是否有 Python Class 实例具有获取类名的属性? [复制]