获取父类名称? [复制]

Posted

技术标签:

【中文标题】获取父类名称? [复制]【英文标题】:Get parent class name? [duplicate] 【发布时间】:2012-04-22 22:23:09 【问题描述】:
class A(object):
    def get_class(self):
        return self.__class__

class B(A):
    def __init__(self):
        A.__init__(self)

b = B()
print b.get_class()

此代码将打印<class '__main__.B'>

如何获取已定义方法的类名(即A)?

【问题讨论】:

你最好检查一下***.com/questions/961048/… 我不认为这个问题是重复的......至少不是它所指向的那个。无论如何都不像。我对这个问题的解决方案:self.__class__.__mro__[1].__name__ 【参考方案1】:

来自文档:https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy

类对象有一个__name__ 属性。通过派生类的__bases__ attr 内省基类可能会更清晰(例如,如果代码要存在于派生类中)。

>>> class Base(object):
...     pass
...
>>> class Derived(Base):
...     def print_base(self):
...         for base in self.__class__.__bases__:
...             print base.__name__
...
>>> foo = Derived()
>>> foo.print_base()
Base

【讨论】:

【参考方案2】:

inspect.getmro(cls)

返回一个类 cls 的基类的元组, 包括 cls,按方法解析顺序。没有类出现超过 一次在这个元组中。请注意,方法解析顺序取决于 cls 的类型。除非正在使用一个非常特殊的用户定义元类型, cls 将是元组的第一个元素。

import inspect
inspect.getmro(B)

结果将是:

(<class '__main__.B'>, <class '__main__.A'>, <type 'object'>)

第一个元素是类本身,第二个元素总是第一个元素。在那之后,事情可能会变得更复杂一些。

【讨论】:

为此+1,mro() 也很有用 MRO 是方法解析顺序。在这里检查例如***.com/questions/1848474/…【参考方案3】:

你可以改变

return self.__class__

return A().__class__

由于没有其他可用的 A() 实例...

【讨论】:

为什么不简单地return A

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

如何在获取之前更改托管对象类名称

有没有办法在运行时在 C++ 中获取基类名称?

从静态上下文中获取测试类名称

Java:在抽象类中创建获取扩展类名称的方法

java中,如何通过实体类名称获取对应的数据表名称

获取视图控制器的类名称作为字符串NSStringFromClass