[英]Python class static methods
我想創建一種實用程序類,它只包含可由名稱類前綴調用的靜態方法。 看起來我做錯了什么:)
這是我的小班:
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
論證。 它們是靜態的,你不需要它。
但是,'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文件中(假設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 __name__ == '__main__':
a = module1.fun()
print module1.fun2(a)
只需在方法定義中刪除self
。 你的意圖是使用靜態。 自我是與該類的實例一起工作。
如果要使用類中定義的函數,只需創建類的實例並應用該函數即可。
結果是:
dir = FileUtility().GetFilePath(path)
只需在您的班級名稱后添加()即可。
因為您使用標准功能而不是靜態,所以不需要@staticmethod。 但在你的情況下,結果是一樣的。
只需刪除函數定義中的self。 由於您使用靜態函數,因此您不需要將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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.