14

オブジェクトが一連のXMLコードで初期化されるクラスを作成します。このクラスには、そのXMLからさまざまなパラメーターを抽出し、それらをオブジェクト状態変数内にキャッシュする機能があります。これらのパラメータの潜在的な量は多く、おそらくユーザーはそれらのほとんどを必要としないでしょう。そのため、「遅延」初期化を実行することにしました。

次のテストケースでは、そのようなパラメータはtitleです。ユーザーが初めてアクセスしようとすると、getter関数はXMLを解析し、状態変数を適切に初期化して、その値を返します。

class MyClass(object):     
    def __init__(self, xml=None):
        self.xml  = xml
        self.title = None

    def get_title(self):
        if self.__title is None:
            self.__title = self.__title_from_xml()
        return self.__title

    def set_title(self, value):
        self.__title = value

    title = property(get_title, set_title, None, "Citation title")

    def __title_from_xml(self):
        #parse the XML and return the title
        return title         

これは見栄えがよく、私にとってはうまく機能します。ただし、getter関数は、オブジェクトに非常に重大な副作用があるという意味で、実際には「セッター」関数であるという事実に少し不安を感じています。これは正当な懸念ですか?もしそうなら、私はそれにどのように対処すべきですか?

4

3 に答える 3

15

この設計パターンは遅延初期化と呼ばれ、正当な用途があります。

于 2011-01-19T19:17:53.220 に答える
5

ゲッターは確かに副作用を実行しますが、それは伝統的に悪い副作用と見なされるものではありません。ゲッターは常に同じものを返すため(状態の間に変化がない限り)、ユーザーに見える副作用はありません。これはプロパティの一般的な使用法であるため、心配する必要はありません。

于 2011-01-19T19:35:00.887 に答える