web-dev-qa-db-ja.com

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)

ここにいくつか質問があります:

  1. 何が間違っていますか?静的メソッドはクラス名で呼び出し可能にすべきではありませんか?
  2. 本当にユーティリティクラスが必要ですか、それともPythonで同じことを達成する他の方法はありますか?
  3. Mainのコードを変更しようとすると、次のようになります: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
_
55
ilyaw77

これらの各関数でself引数を使用しているため、エラーが発生しています。それらは静的であり、必要ありません。

ただし、これを行う「Pythonの」方法は、静的メソッドでいっぱいのクラスを持たせるのではなく、モジュール内で関数を自由にするだけです。

#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スタイルガイドを読んで紹介するのが良いでしょう。方法pythonプログラマーは考えます。

87
Collin

Pythonで静的メソッドを作成するべきではありません。あなたがすべきことは、それらをグローバル関数レベルに配置し、それらを呼び出すときにそれらが含まれているモジュールにアクセスすることです。

foo.py:

def bar():
  return 42

baz.py:

import foo
print foo.bar()

静的メソッドは、最初のパラメーターとして渡されたオブジェクトを取得しません(オブジェクトなし)

selfパラメーターを削除すると、呼び出しが機能するはずです。インポートの問題も関連しています。また、静的コメントも関連しています。

7
Hedlok

Pythonでは、Javaに似た(または何でも)staticメソッドは、実際には目的がないため広く使用されていません。

代わりに、単にモジュールの関数として「メソッド」を定義する必要があります。

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

#main.py
import module1
if __== '__main__':
    a = module1.fun()
    print module1.fun2(a)
4
Thomas Orozco

メソッド定義からselfを削除するだけです。あなたの意図は静的として使用することです。 Selfは、そのクラスのインスタンスを操作します。

2
Saleem Khan

クラスで定義された関数を使用する場合は、クラスのインスタンスを作成して関数を適用するだけです。

結果は次のとおりです。

dir = FileUtility().GetFilePath(path)

クラス名の後に()を追加します。

静的ではなく標準関数を使用しているため、@ staticmethodは必要ありません。しかし、あなたの場合、結果は同じです。

1
Pollux31

関数定義から自分自身を削除するだけです。静的関数を使用しているため、関数の引数として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
0