私は、Pythonにかなり新たなんだと以下のクラスについて質問があります。ベストプラクティス
class Configuration:
def __init__(self):
parser = SafeConfigParser()
try:
if parser.read(CONFIG_FILE) is None:
raise IOError('Cannot open configuration file')
except IOError, error:
sys.exit(error)
else:
self.__parser = parser
self.fileName = CONFIG_FILE
def get_section(self):
p = self.__parser
result = []
for s in p.sections():
result.append('{0}'.format(s))
return result
def get_info(self, config_section):
p = self.__parser
self.section = config_section
self.url = p.get(config_section, 'url')
self.imgexpr = p.get(config_section, 'imgexpr')
self.imgattr1 = p.get(config_section, 'imgattr1')
self.imgattr2 = p.get(config_section, 'imgattr2')
self.destination = p.get(config_section, 'destination')
self.createzip = p.get(config_section, 'createzip')
self.pagesnumber = p.get(config_section, 'pagesnumber')
この例では、別の関数にget_info
をより多くのインスタンス変数を追加するにはOKですが、かコンストラクタ内のすべてのインスタンス変数を定義するのがベストプラクティスですか?新しいインスタンス変数をどこにでも定義すれば、スパゲッティコードになることはありませんか?
編集:このコードは単純な画像スクレーパーで使用しています。 Via get_section
設定ファイルのすべてのセクションを返してから、それらを繰り返して、私が画像を掻き集める各サイトにアクセスします。各繰り返しに対して、get_section
を呼び出して、設定ファイルの各セクションの設定を取得します。 誰かが別のアプローチを考え出すことができればうまくいくでしょう!ありがとう!
http://stackoverflow.com/questions/2964230/python-how-should-i-make-instance-variables-available –
「自己」。__init __() 'の先頭に__parser = None'を設定する必要があります。その理由は、 '__init __()'が*既存の*オブジェクトの第1のメンタとして呼ばれているからです。パーサーが設定ファイルの読み込みに失敗し、例外が発生した場合、例外はキャッチされたelswhere(プログラムが終了しない可能性があります)によって発生する可能性があります。その後、 'Configuration'クラスのオブジェクトはまだ存在し、後の' get_info()は* AttributeError:Configurationインスタンスに属性 '__parser'がありません。 – pepr
@pepr '__init __。py'の最初に' self .__ parser = None'を追加するべきか、それともパーサーの初期化を '__init __。py'から別の関数に移すべきかを答えてください。 – happygoat