[英]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)
。
这里有一些问题:
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.