2012-10-04 17 views
47

Deseo crear un tipo de clase de utilidad que contenga solo métodos estáticos que se puedan llamar con el prefijo de clase de nombre. Parece que estoy haciendo algo mal :)Métodos estáticos de la clase Python

Aquí está mi pequeña clase:

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 

Ahora mi método "principal":

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

y me dio un error: unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).

A tienen algunas preguntas aquí:

  1. ¿qué estoy haciendo mal? ¿No debería llamarse el método estático por nombre de clase?
  2. ¿Realmente necesito una clase de utilidad, o hay otras formas de lograr lo mismo en Python?
  3. Si trato de cambiar el código en el principal que estoy recibiendo: TypeError: GetFilePath() takes exactly 1 argument (2 given)

El nuevo main:

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

Respuesta

82

que está recibiendo el error debido a que usted está tomando un argumento self en cada una de esas funciones. Son estáticos, no lo necesitas.

Sin embargo, la forma 'pitthonic' de hacer esto no es tener una clase llena de métodos estáticos, sino simplemente hacer que las funciones sean libres en un módulo.

#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 

Ahora, en sus otros archivos pitón (suponiendo fileutility.py está en el mismo directorio o en el PYTHONPATH)

import fileutility 

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

No menciona específicamente los métodos estáticos, pero si usted está viniendo de un idioma diferente, PEP 8, la guía de estilo de python es una buena lectura y una introducción a cómo piensan los programadores de python.

+0

Hola Collin, gracias por la respuesta, lo hice como usted sugiere, archivo pitón llano con lista de métodos y en el principal: dir = FileUtility.GetFilePath (ruta) Obtuve un error: el método independiente GetFilePath() debe invocarse con la instancia FileUtility como primer argumento (instancia get str en su lugar) – ilyaw77

+0

Lo siento, dejé a un auto extraviado allí en la primera ejecución. ¿Todavía tienes una clase FileUtility en alguna parte? – Collin

+1

El punto es que no deberías tener una clase FileUtility. Del mismo modo que podría escribir funciones gratuitas en C++, debería hacer lo mismo aquí. Los nombres de los módulos (que se asignan a los archivos) también deben estar en minúsculas. – Collin

8

que realmente no debería estar creando métodos estáticos en Python. Lo que debe hacer es ponerlos en el nivel de función global y luego acceder al módulo en el que se encuentran cuando los llama.

foo.py:

def bar(): 
    return 42 

baz.py:

import foo 
print foo.bar() 
4

en Python, Java similar (o lo que sea) static métodos no se utilizan ampliamente, ya que en realidad no tienen una propósito.

En su lugar, simplemente debe definir sus "métodos" como funciones en un módulo:

#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

Los métodos estáticos no consiguen el objeto pasado como el primer parámetro (sin objeto)

eliminar el parámetro self y las llamadas debería funcionar. El problema de importación también es relevante. Y el comentario estático también es relevante.

1

Si desea usar las funciones definidas en la clase, solo tiene que crear una instancia de su clase y aplicar la función.

Así, el resultado es:

dir = FileUtility().GetFilePath(path) 

Sólo add() después de su nombre de la clase.

@staticmethod no es necesario ya que está utilizando una función estándar, no estática. Pero en tu caso el resultado es el mismo.

2

Simplemente elimine self en la definición de métodos. Tu intención es usar como estático. El yo es para trabajar con una instancia de esa clase.

0

Simplemente elimine el auto en la definición de la función. Como usa las funciones estáticas, no necesita pasar a self como argumento para las funciones. lo tanto, su clase y la función deben ser así:

class FileUtility(): 

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

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