0

Pythonのクラスに慣れようとしています。C++ では、メンバー変数に関して、クラスの構造は単純に思えます。クラス スコープの最初または最後に (必要に応じて public または private として) それらを宣言し、必要に応じて操作します。

これはPythonでどのように処理されますか?

現在、私はクラスを作成し、必要に応じて変数を宣言する傾向があります。

class Foo():
    standard = "standard"
    def __init__(self, arg_1, arg_2):
        self.first = arg_1
        self.second = self.do_something(arg_2)

    def do_something(param):
        second = # do something with self.standard and param and store it.
        return second 

    def do_another_thing():
        self.third = # do another thing.

クラスはメンバー変数なしでも定義でき、動的に追加できることを知っています。

class Foo():
    pass

foo = Foo()
foo.a = "a"
# etc.

これらすべてを一緒に投げると、コードが読みにくくなるため、混乱します。

だから私の質問は、python のメンバー変数に関して、クラスを設計するための推奨される方法は何ですか?


編集:

私が尋ねた方法は誤解を招くものでした。ごめんなさい!しかし、答えは他のことを理解するのに役立ちました。;-)

言い換えると、クラス内で定義された変数と、コーディング中に動的に追加された変数に関する混乱を解決する方法を求めているわけではありません。

私が解決したかったのは、メンバー変数に関する Python クラスの設計についての私の混乱でした。つまり、どこに配置するのが最適なのか、コードの潜在的な読者がそれらを検索せずにすべてを見ることができるようにする. そのため、C++ のクラスについて言及しました。すべてのメンバー変数に対して 1 つの場所があり、クラスに格納されているデータを知りたい場合は、クラスの最初または最後を見ると、必要なすべての情報が得られます。

上記の例では、is standardabove __init__(self, ...)、are inside of 、is insideであり、クラスが大きい場合、他のすべてのメソッドの下にある可能性があります。そのため、行ごとに検索する必要があります。そうしないと、その存在に気付かないでしょう。firstsecond__init(self,...)thirddo_something()

私の質問がより適切に提案されることを願っています。:-)

4

3 に答える 3

4

これらのアプローチはすべて機能するため、独自のコード標準とドキュメントの問題です。

個人的には、関数で「パブリック」メンバー属性を初期化することをお勧めし__init__ます。これにより、それらが何であるかが明らかになり、クラスのドキュメント文字列でそれらを文書化することにより、これを強調する必要があります。

コード全体で動的に変数を追加することもできますが、変数がクラス自体の外でアクセスされることが想定されていない場合にのみ、これを使用することを好みます (通常、self._fooこれを示すために最初に 1 つのアンダースコアを使用します)。

クラス外のプロパティを完全に割り当てることにも使用例がありますが、私にとってこれは、クラス コード自体ではなく、そのクラス インスタンスを使用しているコードの利便性のためです。たとえば、Django では、requestオブジェクトにカスタム属性を頻繁に設定します。これは、それが渡されることがわかっているため、コード内の他の場所でそれらの属性にアクセスできるためです。ただし、オブジェクト自体がその余分な荷物を認識しているという期待はありません。

于 2011-06-05T12:29:41.920 に答える
1

あなたが書いたとき、あなたはあなた自身の質問に答えました

これらすべてを一緒に投げると、コードが読みにくくなるため、混乱します。

読みやすい方を使っています。したがって、最初のコード スニペットと同様のコードを記述します。

考えられる 2 つのアプローチを比較検討する場合は、Python インタープリターを起動して次のコマンドを実行します。import this

于 2011-06-05T12:29:51.097 に答える
0

あなたが述べたように、いつでもどのメソッドでもメンバー変数を作成できます。ただし、メンバー変数をすべて で作成し__init__、実際の値を で割り当てることができない場合は、適切な既定値に初期化することを好みます__init__。これは私にとって2つのことを行います: 1.将来のある時点で、「その変数はどこから来たのか」と疑問に思わなければ、クラスをよりよく理解できます。2. 「割り当て前に使用」エラーから保護します。

于 2011-06-05T16:00:26.973 に答える