1

と の 2 つのクラスがPairありSequenceます。Pairオブジェクトには、位置と値の 2 つの属性があります。Sequenceオブジェクトは一連のオブジェクトPairです。

class Pair():
    def __init__(self, position, value):
        self.position = position
        self.value = value
        self.pair = (position, value)

    def __repr__(self):
        return "< Position: {0}, Value: {1} >".format(self.position, self.value)

class Sequence(Pair):
    def __init__(self, pairs):
        self.pairs = pairs
        self.cseg = [pair.value for pair in pairs]
        self.positions = [pair.position for pair in pairs]

    def __repr__(self):
        return "< Seq. {0} >".format(" ".join([str(x) for x in self.cseg]))

Sequenceこれでオブジェクトを作成できます:

>>> Sequence([Pair(0, 2), Pair(2, 8), Pair(3, 1))
< Seq. 2 8 1 >
>>> Sequence.pairs
[< Position: 0, Value: 2 >,
 < Position: 2, Value: 8 >,
 < Position: 3, Value: 1 >]

以下のコードのように、値リストSequenceのみを与えるオブジェクトを作成するにはどうすればよいですか? Pairこの場合、Pair位置は 0 から n - 1 までのシーケンスでなければなりません。ここで、n は の長さですSequence

>>> Sequence([2, 8, 1])
< Seq. 2 8 1 >
>>> Sequence.pairs
[< Position: 0, Value: 2 >,
 < Position: 1, Value: 8 >,
 < Position: 2, Value: 1 >]

このバージョンの を使用しようとしましSequenceたが、うまくいきませんでした。このエラーが発生しました:

AttributeError: 'int' object has no attribute 'value'

class Sequence(Pair):
    def __init__(self, pairs):

        if not isinstance(pairs[0], Pair):
            self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])

        self.pairs = pairs
        self.cseg = [pair.value for pair in pairs]
        self.positions = [pair.position for pair in pairs]

    def __repr__(self):
        return "< Seq. {0} >".format(" ".join([str(x) for x in self.cseg]))
4

1 に答える 1

4

以下はPair、非オブジェクトを含むリストを渡すときにオブジェクトのリストを作成します。それ以外の場合は、指定されたオブジェクトのリストを次のようPairに割り当てるだけです。Pairself.pairs

class Sequence(Pair):
    def __init__(self, pairs):
        if not isinstance(pairs[0], Pair):
            self.pairs = [Pair(pos, val) for pos, val in enumerate(pairs)]
        else:
            self.pairs = pairs
        self.cseg = [pair.value for pair in self.pairs]
        self.positions = [pair.position for pair in self.pairs]

エラーが発生した理由は、の内容を確認したにもかかわらず、pairsまだ割り当てているためself.pairsです。

class Sequence(Pair):
    def __init__(self, pairs):
        # the following code will run when you're passing a list of integers
        if not isinstance(pairs[0], Pair):
            self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])
        # but the next line will also run
        # which means self.pairs` is now a list of integers
        self.pairs = pairs
        # and that means pair in the following line is an int, not a Pair:
        self.cseg = [pair.value for pair in pairs]
        self.positions = [pair.position for pair in pairs]

最後に、コンストラクターで次のことを行わないでください(に割り当てますself)。

self = Sequence([Pair(pos, val) for pos, val in enumerate(pairs)])

オブジェクトを「上書き」または「置換」しようとしていますが、これは、のコンストラクターでself別のSequenceオブジェクトを作成していることを意味しますSequence。この場合、同じコンストラクターで両方のケースを処理できるため、これは不要です。その結果、コードがよりクリーンになります。

于 2012-07-02T19:12:21.023 に答える