Python类的静态方法

我想创build一种工具类,它只包含静态方法,可以通过名称类前缀调用。 看起来我做错了什么:)

这是我的小class

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. 如果我尝试更改主代码我得到: 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中创build静态方法。 你应该做的是把它们放在全局函数级别,然后在你调用它们时访问它们所在的模块。

foo.py:

 def bar(): return 42 

baz.py:

 import foo print foo.bar() 

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

删除self参数和调用应该工作。 import问题也是相关的。 而静态评论也是相关的。

在python中,java-like(或者其他) 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) 

如果你想使用在类中定义的函数,你只需要创build一个类的实例并应用这个函数。

所以结果是:

 dir = FileUtility().GetFilePath(path) 

只需在你的类名后加()。

@staticmethod是不需要的,因为你使用的是标准函数,而不是静态的。 但在你的情况下,结果是一样的。

只要在方法定义中删除self 。 你的意图是使用静态。 自我是与该类的实例一起工作。

只需在函数定义中删除自己。 既然你使用了静态函数,所以你不需要将自己作为parameter passing给函数。 所以你的类和函数应该是这样的:

 class FileUtility(): @staticmethod def GetFileSize(fullName): fileSize = os.path.getsize(fullName) return fileSize @staticmethod def GetFilePath(fullName): filePath = os.path.abspath(fullName) return filePath