2012-04-10 13 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)を取得するにはどうすればよいですか? A(の他のインスタンスが存在しないため

+2

あなたはもっとよくチェックしてください。http://stackoverflow.com/questions/961048/get-class-that-defined-method-in-python – okm

答えて

45

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

Classオブジェクトは__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 
-3

あなたは)利用可能

return self.__class__ 

return A().__class__ 

を変更することができます...ドキュメントから

+6

単に「return A」にしないのはなぜですか? –

27

inspect.getmro(cls)

戻り方法解像度順にクラスCLSの基本クラス、CLS含む のタプル。このタプルには、 以上のクラスは一度も表示されません。メソッドの解決順序は、 clsのタイプに依存することに注意してください。非常に特殊なユーザー定義のメタタイプが使用されていない限り、 clsがタプルの最初の要素になります。

import inspect 
inspect.getmro(B) 

結果は以下のようになります。

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

最初の要素は、クラス自体は、2番目の要素は最初の両親の常にあります。その後、少し複雑になることがあります。

+4

+1これは、['mro()'](http://docs.python.org/library/stdtypes.html?highlight=mro#class.__mro__)も役に立ちます。 – okm

+0

MROはメソッド解決命令です。例えばここにチェックしてください。 https://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-classes – Chris

関連する問題