58

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

这是我的小班:

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)

A在这里有几个问题:

  1. 我究竟做错了什么?静态方法不应该由类名调用吗?
  2. 我真的需要一个实用程序类,还是有其他方法可以在 Python 中实现相同的功能?
  3. 如果我尝试更改 main 中的代码,我会得到: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
4

7 回答 7

90

您收到错误是因为您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 程序员如何思考的指南。

于 2012-10-04T20:35:13.583 回答
8

你真的不应该在 Python 中创建静态方法。您应该做的是将它们放在全局函数级别,然后在调用它们时访问它们所在的模块。

foo.py:

def bar():
  return 42

巴兹.py:

import foo
print foo.bar()
于 2012-10-04T20:34:39.873 回答
7

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

删除self参数,调用应该可以工作。进口问题也很重要。静态评论也相关。

于 2012-10-04T20:35:57.333 回答
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)
于 2012-10-04T20:34:50.980 回答
3

只需self在方法定义中删除。您的意图是用作静态。自我是使用该类的实例。

于 2015-09-07T11:37:24.973 回答
2

只需删除函数定义中的 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
于 2017-01-06T18:56:07.267 回答
1

如果要使用类中定义的函数,只需创建类的实例并应用该函数。

所以结果是:

dir = FileUtility().GetFilePath(path)

只需在您的班级名称后添加 () 即可。

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

于 2014-06-16T08:55:31.507 回答