Подтвердить что ты не робот

Статические методы класса Python

Я хочу создать класс полезности, который содержит только статические методы, которые вызываются префиксом класса имени. Похоже, я делаю что-то не так:)

Вот мой небольшой класс:

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

Теперь мой "основной" метод:

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

и я получил сообщение об ошибке: unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).

A задайте здесь несколько вопросов:

  • Что я делаю неправильно? Должен ли статический метод быть вызванным классом?
  • Нужен ли мне класс утилиты, или есть ли другие способы достижения этого в Python?
  • Если я попытаюсь изменить код в основном, я получаю: TypeError: GetFilePath() takes exactly 1 argument (2 given)

Новый main:

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

Ответ 1

Вы получаете ошибку, потому что вы принимаете аргумент self в каждой из этих функций. Они статичны, вам это не нужно.

Однако, "питонический" способ сделать это - не иметь класс, полный статических методов, а просто сделать их свободными функциями в модуле.

#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

Теперь в ваших других файлах python (предполагая, что fileutility.py находится в том же каталоге или на PYTHONPATH)

import fileutility

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

Он не упоминает статические методы специально, но если вы исходите с другого языка PEP 8, руководство по стилю python является хорошим чтением и введением как думают программисты питона.

Ответ 2

Вы действительно не должны создавать статические методы в Python. То, что вы должны делать, это разместить их на глобальном уровне функций, а затем получить доступ к модулю, в котором они находятся, когда вы их вызываете.

foo.py:

def bar():
  return 42

baz.py:

import foo
print foo.bar()

Ответ 3

Статические методы не передают объект, переданный в качестве первого параметра (без объекта)

удалите параметр self, и вызовы должны работать. Проблема импорта также актуальна. И статический комментарий тоже.

Ответ 4

В python методы java-like (или что-то еще) static широко не используются, поскольку у них действительно нет цели.

Вместо этого вы должны просто определить свои "методы" как функции в модуле:

#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)

Ответ 5

Просто удалите self в определении методов. Ваше намерение - использовать как статичный. Я должен работать с экземпляром этого класса.

Ответ 6

Если вы хотите использовать свои функции, определенные в классе, вам нужно просто создать экземпляр вашего класса и применить функцию.

Таким образом, результат:

dir = FileUtility().GetFilePath(path)

Просто добавьте() после имени вашего класса.

@staticmethod не требуется, поскольку вы используете стандартную функцию, а не статическую. Но в вашем случае результат будет таким же.

Ответ 7

Просто удалите self в определении функции. Поскольку вы используете статические функции, вам не нужно передавать себя как аргумент для функций. Таким образом, ваш класс и функция должны быть такими:

class FileUtility():

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

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