2016-08-29 1 views
0

Wenn ich eine Datei, foo.py mit Inhalt haben:Methode innerhalb der Klasse ist nicht innerhalb dieser Klasse aufrufbar?

import pandas as pd 

class Marcher(object): 
    def __init__(self, p_path): 
     self.p_path = p_path 

    p_m = 'ID' 

    def first_call(self): 
     df_p = pd.read_csv(self.p_path, header=None) 
     return df_p 

    def p_to_i(self, p): 
     pii = p.set_index(self.p_m, drop=False).loc[p[self.p_m]] 
     return pii 

    m1 = p_to_i(first_call()) 

Was Ich mag würde, dies zu tun, ist so etwas wie dieses:

test = Marcher(p_path='/some/path/to/file.csv') 
test.m1 

aber wenn ich das versuche ich wieder ein Fehler:

TypeError: first_call() takes exactly 1 argument (0 given) 
+0

Mögliche Duplikate von [Wie schmücken Sie eine Methode in einer Klasse?] (Http://stackoverflow.com/questions/1367514/how-to-decorate-a-method-inside-a-class) –

Antwort

2

Warum möchten Sie m1 eine Klassenmitgliedsvariable sein? Verschieben Sie den Anruf einfach wie folgt:

def __init__(self, path): 
    self.path = path 
    self.m1 = self.p_to_i(self.first_call()) 
2

Das Problem ist, dass Sie versuchen, die Methoden vor dem Erstellen einer Instanz aufzurufen. Nehmen wir zum Beispiel eine einfache Klasse Circle:

import math 

class Circle(object): 
    def __init__(self, radius): 
     self.radius = radius 
    def get_area(self): 
     return math.pi * self.radius ** 2 
    # You cannot do this because every circle can have a different radius 
    # area = get_area() 

    # But you can use a property 
    @property 
    def area(self): 
     return self.get_area() 

print Circle(2).area 
# 12.5663706144 
print Circle(10).area 
# 314.159265359 

Auch, manchmal Leute wie zu Cache Eigenschaftswerte, sie zu vermeiden Neuberechnung, die etwa wie folgt aussieht:

class Circle(object): 
    # ... 
    _area = None 
    @property area(self): 
     if self._area is None: 
      self._area = self.get_area() 
     return self._area 

Der Nachteil dieser Methode ist, Wenn Circle kein dynamisches Objekt mehr ist, sollten Sie das Attribut "radius" nicht mehr aktualisieren, nachdem die Instanz erstellt wurde, da der Bereich zwischengespeichert ist und nicht aktualisiert wird.

Verwandte Themen