Python类静态方法

我想创建一种实用程序类,它只包含静态方法,这些方法可以通过名称类前缀调用。看起来我好像做错什么事了:)

这是我的小班:

1
2
3
4
5
6
7
8
9
10
11
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

现在我的"主要"方法:

1
2
3
4
5
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)

A这里有几个问题:

我做错了什么?静态方法不应该按类名调用吗?我是否真的需要一个实用程序类,或者是否有其他方法可以在Python中实现相同的功能?如果我试图改变main中的代码,我将得到:TypeError: GetFilePath() takes exactly 1 argument (2 given)

main:

1
2
3
4
5
6
from FileUtility import *
def main():
    objFile = FileUtility()
    path = 'H:\config_file_list.txt'
    dir = objFile.GetFilePath(path)
    print dir

您会得到这个错误,因为您在每个函数中都使用了一个self参数。它们是静态的,你不需要它。

然而,实现这一点的"python式"方法不是让一个类充满静态方法,而是让它们在模块中成为自由函数。

1
2
3
4
5
6
7
8
9
10
#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上)

1
2
3
4
import fileutility

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

它没有特别提到静态方法,但是如果您来自不同的语言PEP 8,那么python风格指南是一本很好的读物,并介绍了python程序员是如何思考的。


您真的不应该在Python中创建静态方法。您应该做的是将它们放在全局函数级别,然后在调用它们时访问它们所在的模块。

foo.py:

1
2
def bar():
  return 42

baz.py:

1
2
import foo
print foo.bar()


静态方法不会将对象作为第一个参数传入(没有对象)

删除self参数,调用就会正常工作。进口问题也很重要。静态注释也是相关的。


在python中,类java(或其他)static方法没有得到广泛使用,因为它们没有真正的用途。

相反,你应该简单地将你的"方法"定义为模块中的函数:

1
2
3
4
5
6
7
8
9
10
11
#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。您的意图是使用静态。Self将处理该类的实例。


如果想使用类中定义的函数,只需创建类的实例并应用该函数。

所以结果是:

1
dir = FileUtility().GetFilePath(path)

只需在类名后面添加()。

不需要@staticmethod,因为您使用的是标准函数,而不是静态函数。但在你的例子中,结果是一样的。


只需删除函数定义中的self。因为使用的是静态函数,所以不需要传递self作为函数的参数。所以你的类和函数应该是这样的:

1
2
3
4
5
6
7
8
9
10
11
class FileUtility():

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

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