【问题标题】: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]

标签: python class methods


【解决方案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
    • 立即尝试(使用最后两种方法。)这是新式还是旧式类?
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 2011-02-04
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2012-05-06
    相关资源
    最近更新 更多