簡體   English   中英

Python類靜態方法

[英]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)

這里有一些問題:

  1. 我究竟做錯了什么? 靜態方法不應該通過classname調用嗎?
  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

你得到的錯誤是因為你在每個函數中都采用了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM