23

私は次のクラスを持っています:

class vehicle(object):
    def __init__(self, name):
        self.name = name
        self.kinds_list = ["tank", "car", "motorbike", "bike", "quad" ] 

    @property
    def kind(self):
        return self.kind

    @kind.setter
    def kind(self, x):
        if x in self.kinds_list:
            self.kind = x
        else:
            raise AttributeError('No attribute {0} found !'.format(y))

kind を設定すると、最大再帰深度がスタック オーバーフローを超えます。

Q: セッターを書き直して、固定リストのみで動作するようにするにはどうすればよいですか?

4

1 に答える 1

35

最大再帰深度に達した理由は、セッター内でself.kind = ...、同じセッターを再帰的に呼び出すためです。値をプライベート属性として保存する必要があります。名前を に変更self.kindするだけself._kindです。

class vehicle(object):
    def __init__(self, name):
        self.name = name
        self.kinds_list = ["tank", "car", "motorbike", "bike", "quad" ] 

    @property
    def kind(self):
        return self._kind

    @kind.setter
    def kind(self, x):
        if x in self.kinds_list:
            self._kind = x
        else:
            raise ValueError('{0} is an illegal kind of vehicle!'.format(y))

へのアクセスを妨げるものは何もないため、これは他の言語のような実際のプライベート属性ではありませんmy_vehicle._kind。Python の慣例により、アンダースコアで始まるものはすべてプライベートであり、通常はクラスの外で触れるべきではありません。または彼らが言うように: python は同意する大人のためのものです ;)。

セッターのエラーメッセージも少し修正しました。

于 2013-09-24T18:35:01.713 に答える