繁体   English   中英

Python类静态方法

[英]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)

这里有一些问题:

  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

你得到的错误是因为你在每个函数中都采用了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM