名前クラスプレフィックスで呼び出し可能な静的メソッドのみを含む一種のユーティリティクラスを作成したい。私は何か間違っているようです:)
これが私の小さなクラスです。
_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)
。
ここにいくつか質問があります:
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
_
これらの各関数で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プログラマーは考えます。
Pythonで静的メソッドを作成するべきではありません。あなたがすべきことは、それらをグローバル関数レベルに配置し、それらを呼び出すときにそれらが含まれているモジュールにアクセスすることです。
foo.py:
def bar():
return 42
baz.py:
import foo
print foo.bar()
静的メソッドは、最初のパラメーターとして渡されたオブジェクトを取得しません(オブジェクトなし)
self
パラメーターを削除すると、呼び出しが機能するはずです。インポートの問題も関連しています。また、静的コメントも関連しています。
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)
メソッド定義からself
を削除するだけです。あなたの意図は静的として使用することです。 Selfは、そのクラスのインスタンスを操作します。
クラスで定義された関数を使用する場合は、クラスのインスタンスを作成して関数を適用するだけです。
結果は次のとおりです。
dir = FileUtility().GetFilePath(path)
クラス名の後に()を追加します。
静的ではなく標準関数を使用しているため、@ staticmethodは必要ありません。しかし、あなたの場合、結果は同じです。
関数定義から自分自身を削除するだけです。静的関数を使用しているため、関数の引数として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