首页 文章

获取实例的类名?

提问于
浏览
1089

如果我从中执行此操作的函数是实例的类派生的基类,我如何找到在Python中创建对象实例的类的名称?

想到也许the inspect module可能在这里帮助了我,但它似乎没有给我我想要的东西 . 如果没有解析 __class__ 成员,我不知道如何获取这些信息 .

8 回答

  • 13

    您是否尝试过该类的 __name__ 属性?即 type(x).__name__ 将为您提供课程的名称,我认为这就是您想要的 .

    >>> import itertools
    >>> x = itertools.count(0)
    >>> type(x).__name__
    'count'
    

    此方法仅适用于new-style classes . 您的代码可能会使用一些旧式类 . 以下适用于:

    x.__class__.__name__
    
  • 1444

    type()?

    >>> class A(object):
    ...    def whoami(self):
    ...       print type(self).__name__
    ...
    >>>
    >>> class B(A):
    ...    pass
    ...
    >>>
    >>>
    >>> o = B()
    >>> o.whoami()
    'B'
    >>>
    
  • 29
    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):
      ...
    

    例:

    >>> 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'
    >>>
    
  • 301

    或者你可以使用 classmethod 装饰器:

    class A:
        @classmethod
        def get_classname(cls):
            return cls.__name__
    
        def use_classname(self):
            return self.get_classname()
    

    Usage

    >>> A.get_classname()
    'A'
    >>> a = A()
    >>> a.get_classname()
    'A'
    >>> a.use_classname()
    'A'
    
  • 73
    class A:
      pass
    
    a = A()
    str(a.__class__)
    

    上面的示例代码(在交互式解释器中输入时)将生成 '__main__.A' 而不是 'A' ,如果调用了 __name__ 属性,则生成 'A' . 只需将 A.__class__ 的结果传递给 str 构造函数,即可为您处理解析 . 但是,如果您想要更明确的内容,也可以使用以下代码 .

    "{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)
    

    如果您在单独的模块中定义了具有相同名称的类,则此行为更可取 .

    The sample code provided above was tested in Python 2.7.5.

  • 5

    除了获取特殊的name属性之外,您可能会发现自己需要qualified name来获取给定的类/函数 . 这是通过获取类型 __qualname__ 来完成的 .

    在大多数情况下,这些都是完全相同的,但是,当处理嵌套类/方法时,它们的输出会有所不同 . 例如:

    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'
    

    由于内省是你所追求的,所以你可能总是想要考虑 .

  • 4

    你想把类的名字作为字符串吗?

    instance.__class__.__name__
    
  • 25

    好问题 .

    这是一个基于GHZ的简单示例,它可以帮助某些人:

    >>> 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
    

相关问题