1

我正在学习使用classin Python。通常我会写几个function来运行我的脚本,但最近我正在使用类编写。

对于这个基本问题,我很抱歉,但是什么时候可以限制使用课程?

另一方面,在我的代码中,我编写了这个函数,您可以在其中读取目录中的所有文本文件,并将所有值保存在临时文件中。文本文件为 x、y 和 z 格式。该函数返回临时文件的名称、边界框、原点(左上角)和底部(右下角)。在类中转换这样的函数有用吗?如果是,为什么?如果没有,为什么?

import os
import tempfile
import glob

class LaserException(Exception):
    """Laser exception, indicates a laser-related error."""
    pass


sepType = {
        "space": ' ',
        "tab": '\t',
        "comma": ',',
        "colon": ':',
        "semicolon": ';',
        "hyphen": '-',
        "dot": '.'
        }

def tempfile_merge(path,separator,wildcard= '*.txt'):
    file_temp = tempfile.NamedTemporaryFile(delete=False,dir=path)
    name = file_temp.name
    minx = float('+inf')
    maxx = float('-inf')
    miny = float('+inf')
    maxy = float('-inf')
    for file in glob.glob(os.path.join(path,wildcard)):
        for line in open(file, "r"):
            element = line.split(sepType[separator])
            if len(element) < 3:
                raise TypeError("not enough arguments: %s has only %s columns" % (inFile_name_suffix,len(element)))
            try:
                maxx = max(maxx, float(element[0]))
                minx = min(minx, float(element[0]))
                maxy = max(maxy, float(element[1]))
                miny = min(miny, float(element[1]))
            except ValueError:
                raise LaserException("x,y,z are not float-values")
            newelement = " ".join([str(e) for e in element])+ "\n"
            file_temp.write(newelement)
    file_temp.close()
    return(name, ((minx,maxy),(maxx,maxy),(maxx,miny),(minx,miny)),(minx,maxy),(maxx,miny))
4

2 回答 2

4

不要对这个问题感到抱歉。这不是一个愚蠢的问题。当您学习编程时,这是一个不断挣扎的问题。

底线是关于如何将工作划分为函数与类的指导方针,但每个程序员都有自己的意见。您应该找到一些对您有意义的规则并尝试遵守它们。但是,请保持开放的心态并随着您了解更多而适应。

我建议你在这个网站上寻找“何时使用类与函数”的谷歌答案。这是一个很好的例子:在 Python 中,我什么时候应该使用函数而不是方法?

希望这可以帮助。

于 2013-03-01T16:12:58.833 回答
4

通常,当您可能希望对给定的一组持久数据执行多个常见操作时,您希望使用一个类。在这种情况下,将数据和对它们进行操作的函数捆绑到一个对象中会很方便。

在您的情况下,您可以将其转换为一个函数,该函数在其构造函数中读取文件并计算值,然后将它们作为对象的属性提供。但是您没有提供任何方法来使用这些值做任何其他事情,那么为什么要麻烦呢?

或者你可以简单地collections.namedtuple从你的函数中返回一个。这将为您提供命名属性访问,同时还允许数字索引。

我认为作为返回 a 的函数更简单namedtuple,但这在很大程度上取决于您喜欢的风格。

PS——我不希望一个名为tempfile_merge返回边界框或坐标的函数。我可能会谦虚地建议改名。

于 2013-03-01T16:10:32.377 回答