我想创建一种实用程序类,它只包含可由名称类前缀调用的静态方法。看起来我做错了什么:)
这是我的小班:
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
答案 0 :(得分:86)
您收到错误是因为您在每个函数中都使用了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程序员思考方式的一个很好的阅读和介绍。
答案 1 :(得分:8)
你真的不应该在Python中创建静态方法。您应该做的是将它们置于全局功能级别,然后在调用它们时访问它们所在的模块。
foo.py:
def bar():
return 42
baz.py:
import foo
print foo.bar()
答案 2 :(得分:7)
静态方法不会将传入的对象作为第一个参数(无对象)
删除self
参数,调用应该有效。
进口问题也很重要。
静态评论也相关。
答案 3 :(得分:4)
在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)
答案 4 :(得分:2)
只需在方法定义中删除self
即可。你的意图是使用静态。自我是与该类的实例一起工作。
答案 5 :(得分:1)
如果要使用类中定义的函数,只需创建类的实例并应用函数。
结果是:
dir = FileUtility().GetFilePath(path)
只需在你的班级名后加上()。
不需要@staticmethod,因为您使用的是标准功能,而不是静态功能。但在你的情况下,结果是一样的。
答案 6 :(得分:0)
只需删除函数定义中的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