2017-12-28 8 views
1

Hier ist ein einfaches Beispiel:Wenn ich eine Klasse in Python erweitern, wie wird das Ergebnis automatisch als neue Klasse zurückgegeben?

import pandas as pd 

class test_pd(pd.DataFrame): 

    def __init__(self): 
     super().__init__() 


    def my_copy(self): 
     return self.copy() 



if __name__=='__main__': 
    a = test_pd() #a has a.my_copy() 
    b = a.my_copy() #b does not have b.my_copy() 

Ich möchte die test_pd.my_copy() Funktion eine test_pd Klasse zurückkehren, wenn ich copy() Funktion, die von Pandas ist genannt. Technisch kann ich immer etwas wie return test_pd(self.copy()) verwenden. Aber ich hoffe, es könnte eine intelligentere Lösung geben, so dass ich diese Änderung nicht jedes Mal vornehmen muss, wenn ich eine ähnliche Pandas-Funktion aufrufen möchte.

PS: Ich verstehe, dass DataFrame.copy() gibt ein DataFrame Objekt, aber ich frage mich nur, weil meine eigene Klasse erweitert die DataFrame Klasse, ob es möglich ist, meine Aufgabe auch automatisch DataFrame Objekt erstreckt, so, wenn die DataFrame Funktion einen zurück DataFrame Objekt, es wird ein test_pd Objekt zurückgegeben, wenn in test_pd Klasse aufgerufen.

+1

Nein, Sie müssen explizit angeben, was diese Methode zurückgeben soll. – jonrsharpe

Antwort

0

Sie können die Klasseninstanz zuzugreifen, und verwenden Sie dann die cls Funktion als Konstruktor, so:

def my_copy(self): 
    return type(self)(self.copy())

Also hier type(self)test_pd sein wird, aber wenn Sie es weitere Unterklasse wird type(self) ein sub_test_pd sein, und Sie werden diesen Konstruktor aufrufen.

Natürlich, wenn Sie die __init__ auf einer Ebene ändern, müssen Sie auch Ihre my_copy aktualisieren, da dann die Parameter nicht mehr passen.

Beachten Sie, dass dies aus dem oben genannten Grund und anderen Gründen tendenziell ein Anti-Pattern ist. Ja, es ist technisch möglich, und ja, es kann von Vorteil sein. Aber manchmal kann es ziemlich dramatisch ausfallen.

Verwandte Themen