2017-02-16 23 views
0

Ich habe eine neue Klasse geschaffen, die eine andere Datenstruktur (einen Pandas Datenrahmen in diesem Fall in denen er enthält.Kann ich die Methoden eines Attributs auf seine Elternklasse erweitern?

Diese Klasse andere Attribute und andere Methoden in ihm haben würde, zusätzlich zu dem Datenrahmen Pandas. Einige davon Methoden werden ähnlich wie Methoden im DataFrame benannt, zB to_excel, aber machen Sie noch einige zusätzliche Dinge vor dem Aufruf der DataFrame-Methode.Unabhängig davon ist der Hauptbestandteil dieser DataFrame.Daher möchte ich in der Lage sein, alle anderen Methoden zu verwenden der Datenrahmen, zB getitem, direkt auf Objekte dieser Klasse.

class NewDataStructure: 
    def __init__(self): 
     self.df = pd.DataFrame() 
     # have some extra attributes here that the pandas DataFrame doesn't have 

    def __getitem__(self, key): 
     return self.df.__getitem__(key) 

    def to_excel(self, writer): 
     # do some extra stuff here that the pandas DataFrame doesn't do but use the pandas method eventually 
     self.df.to_excel(writer) 

gibt es eine Möglichkeit die Methoden eines Attributs auf seine Elternklasse zu erweitern? Oder mache ich das falsch? Sollte die NewDataStructure vom DataFrame erben?

Antwort

1

Entweder __getattr__ außer Kraft setzen:

class NewDataStructure: 
    def __init__(self): 
     self.df = pd.DataFrame() 
     # have some extra attributes here that the pandas DataFrame doesn't have 

    def __getitem__(self, key): 
     return self.df.__getitem__(key) 

    def __getattr__(self, item): 
     try: 
      return vars(self)[item] 
     except KeyError: 
      return getattr(self.df, item) 

    def to_excel(self, writer): 
     # do some extra stuff here that the pandas DataFrame doesn't do but use the pandas method eventually 
     self.df.to_excel(writer) 

obj = NewDataStructure() 
print(obj.ix) 
# <pandas.core.indexing._IXIndexer object at 0x01FE7090> 
# pandas' ix 
print(obj.to_excel) 
# <bound method NewDataStructure.to_excel of <__main__.NewDataStructure object at 0x005670F0>> 
# NewDataStructure's to_excel 

Wenn wir to_excel von NewDataStructure Klasse zu entfernen, werden wir Pandas mit seinem to_excel:

class NewDataStructure: 
     def __init__(self): 
      self.df = pd.DataFrame() 
      # have some extra attributes here that the pandas DataFrame doesn't have 

     def __getitem__(self, key): 
      return self.df.__getitem__(key) 

     def __getattr__(self, item): 
      try: 
       return vars(self)[item] 
      except KeyError: 
       return getattr(self.df, item) 

obj = NewDataStructure() 
print(obj.to_excel) 
#  <bound method DataFrame.to_excel of Empty DataFrame 
#  Columns: [] 
#  Index: []> 

Oder erben von pd.DataFrame (wahrscheinlich einfacher und dem besseren Weg zu gehen):

class NewDataStructure(pd.DataFrame): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

obj = NewDataStructure() 
print(obj.to_excel) 
#  <bound method DataFrame.to_excel of Empty DataFrame 
#  Columns: [] 
#  Index: []> 
# pandas to_excel 

Wenn wir zu NewDataStructure to_excel hinzufügen:

def to_excel(self, *args, **kwargs): 
    # do some extra stuff here that the pandas DataFrame doesn't do but use the pandas method eventually 
    super().to_excel(*args, **kwargs) 
. 
. 

obj = NewDataStructure() 
print(obj.to_excel) 
# <bound method NewDataStructure.to_excel of Empty NewDataStructure 
# Columns: [] 
# Index: []> 
Verwandte Themen