オブジェクトが初期化されたクラスを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
これは良さそうに見えますし、私のために正常に動作します。しかし、ゲッター関数は実際にはオブジェクトに非常に重大な副作用があるという意味では "セッター"であるという事実によって少し邪魔されています。これは正当な懸念ですか?もしそうなら、どのように私はそれに対処する必要がありますか?
質問に対する実際の回答が何であるかにかかわらず、先頭の二重下線は使用しないでください。彼らは名前のマングリング、すなわち多くの潜在的な痛みとゼロ利得を開始します。単一の先頭のアンダースコアを使用してください。 – delnan
なぜそれが問題なのかわかりません。 –
マイナーリファクタリング提案:コンストラクタで 'self._title'を初期化せず、ゲッターの条件を' not hasattr(self、 "_title") 'で置き換えてください。 –