Python类静态方法

ily*_*w77 55 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
Run Code Online (Sandbox Code Playgroud)

现在我的"主要"方法:

from FileUtility import *
def main():
        path = 'C:\config_file_list.txt'
        dir = FileUtility.GetFilePath(path)
        print dir
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).

这里有一些问题:

  1. 我究竟做错了什么?静态方法不应该通过classname调用吗?
  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
Run Code Online (Sandbox Code Playgroud)

Col*_*lin 87

你得到错误是因为你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
Run Code Online (Sandbox Code Playgroud)

现在,在你的其他python文件中(假设fileutility.py在同一个目录中或在PYTHONPATH)

import fileutility

fileutility.get_file_size("myfile.txt")
fileutility.get_file_path("that.txt")
Run Code Online (Sandbox Code Playgroud)

它没有特别提到静态方法,但如果你来自另一种语言PEP 8,那么python风格指南就是对python程序员思考方式的一个很好的阅读和介绍.

  • 为什么这不是"好的OO设计"?如果添加常量,则它们位于模块的命名空间中.在C++中,您可以将常量放在命名空间中,因此这同样适用.在Python中,模块是名称空间.将变量放在模块的顶层不会将它们放在全局命名空间中. (7认同)
  • 关键是,你不应该有一个FileUtility类.就像你可以在C++中编写自由函数一样,你也应该在这里做同样的事情.模块名称(映射到文件)也应全部为小写. (2认同)

Ign*_*ams 8

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

foo.py:

def bar():
  return 42
Run Code Online (Sandbox Code Playgroud)

baz.py:

import foo
print foo.bar()
Run Code Online (Sandbox Code Playgroud)


Hed*_*lok 7

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

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