0

これが私の全体的な指示です

0 から 255 の範囲の整数値を使用して RGB カラーを表す Color クラスを記述します。 クラスは次の条件を満たしている必要があります。これらの値 赤、緑、青のチャンネルの値を返す public メソッドを提供します

PPM 画像を表す PortablePixmap クラスを記述します。クラスは次の条件を満たしている必要があります: image.py に配置する マジック ナンバー、幅、高さ、最大色値、およびクライアントからのピクセル データを受け取り、それらの値を格納するコンストラクタを提供する ピクセル データをリスト (またはリストのリスト) として格納するof) Color オブジェクト PPM 画像の文字列表現を返す public メソッドを提供する

PPM 画像ファイルを開き、その内容を読み取り、その内容を保持する PortablePixmap オブジェクトを返す read_ppm 関数を作成します。関数は次の条件を満たす必要があります: image.py に配置する PPM 画像ファイルの内容を読み取る PPM 画像ファイルのフォーマットに依存しない 期待されるピクセル数と提供されたピクセル数が異なる場合はエラーで終了する

read_ppm 関数をテストするメイン関数を作成します。関数は main.py に配置する必要があります

これは私がこれまでに持っているものです

class Color:
# constructor takes in values from client and stores them
def __init__(self, red, green, blue): 


    # checks that type of arg == int: raises exception otherwise 
    if (isinstance(red, int) and isinstance(green, int) and isinstance(blue, int)):     
        print("good stuff, indeed integers")
    else:   
        raise TypeError("Argument must be an integer.")

    # checks if values are between 0 and 225 
    if red < 0 or red > 225: 
        print("0 < rgb values < 225")
    elif green < 0 or green > 225:
        print("0 < rgb values < 225") 
    elif blue < 0 or blue > 225:
        print("0 < rgb values < 225")

    # instance variables (RGB values)
    self._red = red 
    self._green = green
    self._blue = blue 


# methods that reuturn RGB values
def returnRed(self): 
    return self._red 

def returnGreen(self):
    return self._green

def returnBlue(self):
    return self._blue


'''class that represents a PPM image'''
class PortablePixmap:
    def __init__(self, magic_number, width, height, max_color_value, pixel_data):
        self._magic_number = magic_number
        self._width = width
        self._height = height
        self._max_color_value = max_color_value
        self._pixel_data = pixel_data


    def __str__(self):
        s = self._magic_number
        s += '\n' + str(self._width)
        s += ' ' + str(self._height)
        s += '\n' + str(self._max_color_value)
        for pixel in self._pixel_data:
            s += ' ' + str(pixel[0])
            s += ' ' + str(pixel[1])
            s += ' ' + str(pixel[2])

        return s

明確にするためにいくつか質問があります.. 1. Color クラスを正しく作成しましたか? 2.そのクラスで例外を発生させる必要さえありますか? 最終的には、すべてを順番に含むファイルから読み取りますが、必ずしもそれ自体の個別の行にあるとは限りません。

これについて正しく行っているかどうかを本当に知りたいだけです。手順は段階的に見えますが、すべてがどのように接続されているかをよく理解していないので、やりすぎているか少なすぎているのではないかと心配しています.

前もって感謝します

4

1 に答える 1

0

値をチェックする必要があることは仕様から明らかではなく、チェックは場合によっては例外を発生させるだけであり、それ以外の場合は副作用 (印刷) を引き起こします。再利用の観点からは、例外があればそれのみを使用したいと思います。インデントエラー(ソースではなく、ここだけだと思います)は別として、 Color クラスは要求をカバーしているように見えますが、アクセサーでは非常に非pythonicです。おそらく誰かがJavaで訓練されました。

docstring は、その上ではなく、PortablePixmap クラス内にある必要があります。

最も注目に値するのは、クラスが PPMのフォーマットに敏感ではなく、ピクセルを 8 ビットの符号なし RGB として格納するという要求の組み合わせです。これにより、すべての PPM をサポートすることは不可能になります。PPM は 16 ビット値をサポートするためです ( PPM 形式の maxval フィールドに注意してください)。

PortablePixmap クラスも Color クラスを使用しません。「ピクセル データを Color オブジェクトのリスト (またはリストのリスト) として保存します」。その要件はかなり非効率な実装を余儀なくさせますが、すべては演習だと思います。ピクセル データ文字列から RGB トリプレットを抽出する必要があります。指定された 1 つのチェックが必要な場所でもあります。正確に正しい数のピクセルがあることを確認します。それが失敗した場合、ValueError 例外が発生することが予想されます。

このようなことを書いていたら、スロットを使用して Color などのクラスのメモリ使用量を減らしたり、配列を使用して多数の限られた範囲の数値を処理したり、場合によってはプロパティを使用して扱いにくい getter メソッドを使用せずにストレージを透過的にしたりしていたかもしれません。分割して結合すると、ピクセルのコレクションを簡単に処理できます。

于 2014-04-05T14:03:18.713 に答える