Python类静态方法

时间:2012-10-04 20:31:00

标签: python static

我想创建一种实用程序类,它只包含可由名称类前缀调用的静态方法。看起来我做错了什么:)

这是我的小班:

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. 调用
  3. 我真的需要一个实用程序类,还是有其他方法可以在Python中实现相同的功能?
  4. 如果我尝试更改main中的代码:TypeError: GetFilePath() takes exactly 1 argument (2 given)
  5. 新的main

    from FileUtility import *
    def main():
        objFile = FileUtility()
        path = 'H:\config_file_list.txt'
        dir = objFile.GetFilePath(path)
        print dir
    

7 个答案:

答案 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