2012-04-10 156 views
29
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)?

+2

你最好检查http://stackoverflow.com/questions/961048/get-class-that-defined-method-in-python – okm 2012-04-10 16:16:07

回答

45

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

Class对象有__name__属性。通过派生类的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 
-3

你可以改变

return self.__class__ 

return A().__class__ 

因为有一个的()没有其他可用的情况下...

+6

为什么不简单地'返回A'? – 2012-04-10 15:55:10

27

inspect.getmro(cls)

返回类CLS的基类的元组,包括 CLS,在方法的解析顺序。没有班级在此元组中出现超过 。请注意,方法解析顺序取决于 cls的类型。除非使用了一个非常独特的用户定义的元类型,否则cls将是元组的第一个元素。

import inspect 
inspect.getmro(B) 

结果将是:

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

第一个元素是类本身,第二个元素永远是第一位的家长。之后,事情会变得复杂一些。

+4

+1,['mro()'](http://docs.python.org/library/stdtypes.html?highlight=mro#class.__mro__)也是有用的 – okm 2012-04-10 16:24:52

+0

MRO是方法解析顺序。在这里检查https://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-classes – Chris 2018-02-23 15:18:01