1

私はでの使用法を学んでいclassます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

通常、特定の永続データのセットに対して実行する可能性のある一般的な操作が複数ある場合は、クラスを使用します。その場合、データとそれらを操作する関数を1つのオブジェクトにバンドルすると便利です。

あなたの場合、これをコンストラクターでファイルを読み取り、値を計算し、それらをオブジェクトの属性として使用できるようにする関数に変換できます。しかし、あなたはそれらの値で他のことをするためのメソッドを提供していないので、なぜわざわざするのですか?

または、関数から単にaを返すこともできcollections.namedtupleます。これにより、名前付き属性へのアクセスが可能になると同時に、数値のインデックス付けも可能になります。

を返す関数としてはもっと簡単だと思いますnamedtupleが、これは主に好みのスタイルの問題です。

tempfile_mergePS-バウンディングボックスまたは座標を返すという名前の関数は期待していません。名前の変更を謙虚に提案するかもしれません。

于 2013-03-01T16:10:32.377 に答える
4

この質問について申し訳ありません。これはばかげた質問ではありません。あなたがプログラミングを学ぶとき、それは絶え間ない苦労である質問です。

肝心なのは、作業を関数とクラスに分割する方法に関するガイドラインがありますが、すべてのプログラマーは独自の意見を持っています。あなたはあなたにとって意味のあるいくつかのルールを見つけて、それらに固執するように努めるべきです。しかし、心を開いて、学習しながら適応してください。

私が提案するのは、このサイトを見て、「クラスと関数をいつ使用するか」というグーグルへの回答を探すことです。これが良い例です。Pythonでは、メソッドの代わりに関数を使用する必要があるのはいつですか。

お役に立てれば。

于 2013-03-01T16:12:58.833 に答える