2012-10-04 22 views
47

Ich möchte eine Art Dienstprogrammklasse erstellen, die nur statische Methoden enthält, die durch das Namensklassenpräfix aufgerufen werden können. Sieht aus wie ich etwas falsch tue :)Python-Klasse statische Methoden

Hier ist meine kleine Klasse:

class FileUtility(): 

    @staticmethod 
    def GetFileSize(self, fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(self, fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath 

Nun meine "main" Methode:

from FileUtility import * 
def main(): 
     path = 'C:\config_file_list.txt' 
     dir = FileUtility.GetFilePath(path) 
     print dir 

und ich habe einen Fehler: unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).

A haben ein paar Fragen hier:

  1. Was mache ich falsch? Sollte die statische Methode nicht nach Klassennamen aufrufbar sein?
  2. Benötige ich wirklich eine Dienstprogrammklasse oder gibt es andere Möglichkeiten, dasselbe in Python zu erreichen?
  3. Wenn ich versuche, den Code zu ändern in Haupt Ich erhalte: TypeError: GetFilePath() takes exactly 1 argument (2 given)

Die neuen main:

from FileUtility import * 
def main(): 
    objFile = FileUtility() 
    path = 'H:\config_file_list.txt' 
    dir = objFile.GetFilePath(path) 
    print dir 

Antwort

82

Sie den Fehler bekommen, weil Sie ein self Argument in jeder dieser Funktionen nehmen. Sie sind statisch, du brauchst es nicht.

Der 'pythonische' Weg, dies zu tun, ist jedoch nicht eine Klasse voller statischer Methoden, sondern nur freie Funktionen in einem Modul.

#fileutility.py: 

def get_file_size(fullName): 
    fileSize = os.path.getsize(fullName) 
    return fileSize 


def get_file_path(fullName): 
    filePath = os.path.abspath(fullName) 
    return filePath 

Nun, in der anderen Python-Dateien (unter der Annahme fileutility.py ist im gleichen Verzeichnis oder auf die PYTHONPATH)

import fileutility 

fileutility.get_file_size("myfile.txt") 
fileutility.get_file_path("that.txt") 

Es ist nicht statische Methoden spezifisch nicht erwähnt, aber wenn Sie aus einer anderen Sprache kommend, PEP 8, ist der Python Style Guide eine gute Lektüre und Einführung, wie Python Programmierer denken.

+0

Hallo Collin, danke, ich tat, wie Sie Ebene Python-Datei mit einer Liste von Methoden und in Haupt vorgeschlagen,: So Ihre Klasse und Funktion so sein sollte dir = FileUtility.GetFilePath (Pfad) Ich habe einen Fehler bekommen: Unbound-Methode GetFilePath() muss mit FileUtility-Instanz als erstes Argument aufgerufen werden (hat stattdessen eine str-Instanz) – ilyaw77

+0

Entschuldigung, beim ersten Durchlauf habe ich ein Streuner selbst dort gelassen. Haben Sie irgendwo noch eine FileUtility-Klasse? – Collin

+1

Der Punkt ist, sollten Sie keine Klasse FileUtility haben. Genauso wie Sie in C++ freie Funktionen schreiben könnten, sollten Sie dies auch hier tun. Modulnamen (die zu Dateien gehören) sollten auch alle Kleinbuchstaben sein. – Collin

8

Sie sollten wirklich nicht statische Methoden in Python erschaffen. Was Sie tun sollten, ist, sie auf die globale Funktionsebene zu bringen und dann auf das Modul zuzugreifen, in dem sie sich befinden, wenn Sie sie anrufen.

foo.py:

def bar(): 
    return 42 

baz.py:

import foo 
print foo.bar() 
4

In Python, Java-like (oder was auch immer) static Methoden sind nicht weit verbreitet, da sie eine nicht wirklich haben Zweck.

Stattdessen sollten Sie einfach Ihre „Methoden“, wie Funktionen in einem Modul definieren:

#module1.py 
def fun1(): 
    return do_stuff() 
def fun2(arg): 
    return do_stuff_with_arg(arg) 

#main.py 
import module1 
if __name__ == '__main__': 
    a = module1.fun() 
    print module1.fun2(a) 
6

Statische Methoden nicht bekommen, das Objekt als ersten Parameter (kein Objekt) bestanden in

entfernen Sie den self Parameter und die Anrufe funktionieren sollte. Das Importproblem ist ebenfalls relevant. Und der statische Kommentar auch relevant.

1

Wenn Sie Ihre in der Klasse definierten Funktionen verwenden möchten, müssen Sie nur eine Instanz Ihrer Klasse erstellen und die Funktion anwenden.

So ist das Ergebnis:

dir = FileUtility().GetFilePath(path) 

Fügen Sie einfach() nach dem Klassennamen.

@staticmethod wird nicht benötigt, da Sie die Standardfunktion verwenden, nicht statisch. Aber in Ihrem Fall ist das Ergebnis dasselbe.

2

Entfernen Sie einfach self in Methoden Definition. Ihre Absicht ist es, als statisch zu verwenden. Self soll mit der Instanz dieser Klasse arbeiten.

0

Entfernen Sie einfach das Selbst in der Funktionsdefinition. Da Sie die statischen Funktionen verwenden, müssen Sie sich selbst nicht als Argument für die Funktionen übergeben.

Beantwortungs
class FileUtility(): 

    @staticmethod 
    def GetFileSize(fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath