2016-08-10 7 views
1

Ich arbeite mit einer älteren Version von Python, 2.6.5. Ich kann dir verwenden, um zu sehen, welche Mitglieder ein Objekt hat, aber ich möchte zwischen den Mitgliedern in einem Objekt im Vergleich zu den von einer Elternklasse geerbten Mitgliedern unterscheiden.Python-Introspektion mit Objektvererbung

class Parent(object): 

    def parent_method1(self): 
     return 1 

    def parent_method2(self): 
     return 2 

class Child(Parent): 

    def child_method1(self): 
     return 1 

Gibt es eine Möglichkeit (das heißt dir) eine Instanz von Child-Objekt zu untersuchen und welche Methoden sind von der Child-Klasse zu unterscheiden und die sich von der übergeordneten Klasse geerbt werden?

+1

Die genaue Version von Python keiner Rolle spielt in diesem speziellen Fall. –

Antwort

2

Nein, dir() gibt diese Unterscheidung nicht.

Sie müssten manuell class MRO durchqueren und produzieren die Liste selbst:

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

Dies erzeugt:

>>> 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__')] 

Die Funktion leicht erweitert werden können Namen überspringen bereits in einer Unterklasse gesehen :

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) 

zu diesem Zeitpunkt produziert es genau die gleiche Nu mber von Einträgen wie dir(Child), mit Ausnahme der Reihenfolge der Namen in (die oben genannten Gruppen sie pro Klasse) erscheinen:

>>> sorted(name for c, name in dir_with_context(Child)) == dir(Child) 
True