web-dev-qa-db-ja.com

メンバー変数を「新しい」変数で上書きするのを止めるにはどうすればよいですか?

私のプログラミング経験の大部分は、C++および(震動)FORTRAN(私はそのようなプログラマーではなく科学者ですが、私は最善を尽くしています)での経験があります。私は最近python=を広範囲に使用し始めて、それが素晴らしいと感じました。しかし、私は苛立たしい数時間を費やして、新しいオブジェクトメンバーを機能、すなわち.

def some_func(self):
    self.some_info = list()

しかし、別の目的でこのオブジェクトのメンバーsome_infoを別の場所で既に作成しているため、明らかに後で悪いことが発生しましたが、ここまで追跡するのは困難でした。

C++のような言語では、オブジェクトメンバーをその場で作成することはできないため、これは不可能です。私はこれを処理する言語に慣れているので、python(および他の動的に型付けされた言語)が提供する自由を悪用することを防ぐための十分に開発された手続き規則はありません。

では、pythonなどの言語を使用するときにこの種の間違いを防ぐための最良の方法は何でしょうか?

5
Bogdanovist

これは多少些細なアドバイスかもしれませんが、本当に必要な場合を除いて、__init__メソッドの外(特にクラスのメソッドの外ではない)に属性を作成しないようにしてください。 pylint は、他のものの間でこれをキャッチします。

もちろん、既存の属性を別のものに完全に再割り当てする可能性はまだありますが、少なくとも、一度にすべての属性を確認できる単一の場所があります。また、これにより、構築直後にオブジェクトが有効になり、他の内部状態変更メソッドの呼び出しが不要になります。

10
fjarri

簡単に言えば、クラスを小さくし、そのような競合を見つけやすいように十分小さくします。通常、__init__でメンバーを作成する方法が見つからない場合は、それを独自のクラスに分割することをお勧めします。また、ローカル変数が実行するときにメンバーを使用しないでください。

プログラミング言語が慣行を課さないときは、自分でそれらを課さなければなりません。

5
Karl Bielefeldt

私は別の目的でこのオブジェクトのメンバーsome_infoを他の場所ですでに作成しました

まあ、あなたはあなたのクラスとメンバーの本当の名前を投稿しませんでしたが、そのようなことはsome_infoにはあいまいな名前があり、それが実際の目的であることは明確ではありません。したがって、ここでの他の良い答えに加えて、それを避けて、変数の目的をより明確に示す名前を選択してください特にメンバー変数の場合

4
Doc Brown