2012-10-04 12 views
47

名前クラスの接頭辞で呼び出し可能な静的メソッドのみを含むユーティリティクラスの種類を作成したいとします。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. 私が間違って何をやっている:

    Aは、ここではいくつかの質問がありますか?静的メソッドをclassnameで呼び出し可能にすべきではありませんか?

  2. 私は本当にユーティリティクラスが必要ですか、それともPythonで同じことを達成する他の方法はありますか?
  3. 私が取得していますメインのコードに変更しようとした場合: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 

答えて

82

あなたがそれらの各機能にself引数を取っているので、あなたがエラーを取得しています。彼らは静的です、あなたはそれを必要としません。

しかし、これを行う「pythonic」方法は、静的メソッドがいっぱいではなく、モジュール内で自由な関数にすることです。

#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ファイルにそれを具体的に静的メソッドを言及していない

import fileutility 

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

(仮定fileutility.pyは、同じディレクトリまたはPYTHONPATHである)、しかし、あなたはしている場合PEP 8という別の言語から来ていますが、Pythonスタイルのガイドは、Pythonプログラマーの考え方をよく読んで紹介しています。

+0

こんにちはコリン、返事をありがとう、あなたが示唆したように、私は、メソッドのリストと、メインにプレーンのpythonファイルでします。dir = FileUtility.GetFilePath(パス)私はエラーが発生しました:unboundメソッドGetFilePath()はFileUtilityインスタンスを最初の引数として呼び出さなければなりません(代わりにstrインスタンスを取得) – ilyaw77

+0

最初の実行時にそこに迷子になってしまいました。あなたはまだFileUtilityクラスをどこかに持っていますか? – Collin

+1

ポイントは、FileUtilityクラスを持つべきではないということです。 C++で自由な関数を書くのと同じように、ここで同じことをする必要があります。モジュール名(ファイルにマップする)もすべて小文字にする必要があります。 – Collin

8

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

foo.py:

def bar(): 
    return 42 

baz.py:Pythonで

import foo 
print foo.bar() 
4

、Javaに似(または任意の)彼らは本当に持っていないよう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) 
6

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

selfパラメータを削除し、呼び出しが動作するはずを得ることはありません。 インポートの問題も関連しています。 静的コメントも関連しています。

1

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

だから、結果は次のとおりです。

dir = FileUtility().GetFilePath(path) 

ちょうどあなたのクラス名の後に()を追加します。

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

2

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

0

機能定義で自己を削除するだけです。静的関数を使用しているので、関数の引数として自己を渡す必要はありません。 だからあなたのクラスや関数は次のようにする必要があります:

class FileUtility(): 

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

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