63
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)?

4

3 回答 3

86

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

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

>>> 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
于 2012-04-10T15:57:47.530 回答
62

inspect.getmro(cls)

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

import inspect
inspect.getmro(B)

结果将是:

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

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

于 2012-04-10T16:17:24.920 回答
-6

你可以改变

return self.__class__

return A().__class__

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

于 2012-04-10T15:53:12.980 回答