2013-03-01 42 views
1

我正在学习使用classPython。通常我会写几个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)) 
+0

你是什么意思,“但是什么时候是限制使用一个类?” ? – Duniyadnd 2013-03-01 16:07:41

+0

我还不清楚我需要多少推动我的编码风格才能使用这个类。我知道答案是你需要的类,但我很想知道决定编写一个类或一个函数的方法 – 2013-03-01 16:11:16

+0

我想你应该在http://codereview.stackexchange.com/上发布它以获得更详细的反馈 – YXD 2013-03-01 16:15:58

回答

4

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

底线是有关于如何将工作分为功能和类的指导原则,但每个程序员都有自己的意见。你应该找到一些对你有意义的规则,并试着坚持下去。但是,保持开放的态度,并在你学习更多的时候适应。

我会建议你环顾这个网站,寻找谷歌的“何时使用类与功能”的答案。这里是一个好的:In Python, when should I use a function instead of a method?

希望这会有所帮助。

4

通常你需要的时候有你可能想在一个给定的持久性数据的做多的共同操作使用的类。在这种情况下,将数据和对其进行操作的函数捆绑到一个对象中很方便。

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

你可以简单地从你的函数返回一个collections.namedtuple。这会给你命名属性访问,同时也允许数字索引。

我认为这是一个函数返回namedtuple更直接,但这主要是你喜欢的风格的问题。

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