2016-08-10 12 views
1

古いバージョンのPython 2.6.5で作業しています。私はdirを使ってオブジェクトのメンバーを調べることができますが、オブジェクト内のメンバーと親クラスから継承したメンバーを区別したいと思います。Pythonのオブジェクト継承によるイントロスペクション

class Parent(object): 

    def parent_method1(self): 
     return 1 

    def parent_method2(self): 
     return 2 

class Child(Parent): 

    def child_method1(self): 
     return 1 

(すなわちDIR)子オブジェクトのインスタンスを検査し、子クラスからのものであり、親クラスから継承されたメソッドを区別する方法はありますか?

+1

のPythonの正確なバージョンは、この特定の場合には関係ありません:名前は(クラスごとに上記グループにそれら)に表示される順番を除くdir(Child)としてエントリーのmber、。 –

答えて

2

いいえ、dir()は区別できません。

は手動class MROを横断し、リストを自分で作る必要があるだろう:

def dir_with_context(cls): 
    for c in cls.__mro__: 
     for name in sorted(c.__dict__): 
      yield (c, name) 

これが生成します。

>>> list(dir_with_context(Child)) 
[(<class '__main__.Child'>, '__doc__'), (<class '__main__.Child'>, '__module__'), (<class '__main__.Child'>, 'child_method1'), (<class '__main__.Parent'>, '__dict__'), (<class '__main__.Parent'>, '__doc__'), (<class '__main__.Parent'>, '__module__'), (<class '__main__.Parent'>, '__weakref__'), (<class '__main__.Parent'>, 'parent_method1'), (<class '__main__.Parent'>, 'parent_method2'), (<type 'object'>, '__class__'), (<type 'object'>, '__delattr__'), (<type 'object'>, '__doc__'), (<type 'object'>, '__format__'), (<type 'object'>, '__getattribute__'), (<type 'object'>, '__hash__'), (<type 'object'>, '__init__'), (<type 'object'>, '__new__'), (<type 'object'>, '__reduce__'), (<type 'object'>, '__reduce_ex__'), (<type 'object'>, '__repr__'), (<type 'object'>, '__setattr__'), (<type 'object'>, '__sizeof__'), (<type 'object'>, '__str__'), (<type 'object'>, '__subclasshook__')] 

機能は簡単にすでにサブクラスで見られる名前をスキップするように拡張することができます:それはまったく同じNUを生成する時点で

def dir_with_context(cls): 
    seen = set() 
    for c in cls.__mro__: 
     for name in sorted(c.__dict__): 
      if name not in seen: 
       yield (c, name) 
       seen.add(name) 

>>> sorted(name for c, name in dir_with_context(Child)) == dir(Child) 
True 
関連する問題