我想创建一种实用程序类,它只包含静态方法,这些方法可以通过名称类前缀调用。看起来我好像做错什么事了:)
这是我的小班:
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 |
我得到一个错误:
A这里有几个问题:
我做错了什么?静态方法不应该按类名调用吗?我是否真的需要一个实用程序类,或者是否有其他方法可以在Python中实现相同的功能?如果我试图改变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 |
您会得到这个错误,因为您在每个函数中都使用了一个
然而,实现这一点的"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在相同的目录中或在
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() |
静态方法不会将对象作为第一个参数传入(没有对象)
删除
在python中,类java(或其他)
相反,你应该简单地将你的"方法"定义为模块中的函数:
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) |
只需在方法定义中删除
如果想使用类中定义的函数,只需创建类的实例并应用该函数。
所以结果是:
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 |