7

私は Python にまったく慣れていないので、これを理解できないようです。この単純な Python コードを考えてみてください。

class point:
   i = 34


test = point()
test.y = 45

print test.y 

ご覧のとおり、テストと呼ばれるポイントのインスタンスが、ポイント クラスのデータ メンバーではないtest.y = 45場合に実行されます。yエラーは発生せず、自動的に y 属性がクラスに追加されたようです。

なぜこれが起こったのですか?これは誤植ではありませんか?または、非常に基本的なものが欠けていますか。同じことは C++ では実行できず、コンパイラ エラーがスローされます。この奇妙な機能の理由は何ですか?

4

3 に答える 3

7

これは C++ (または Java) ではなく Python であるためです。それを誤機能と呼ぶのは、Python がどのように機能するかについての根本的な誤解です。

Python では、変数や属性を宣言しません。「ポイント クラスのデータ メンバー」などというものはありません。あなたiは単なるクラスレベルの変数ですが、その属性をクラスに関連付ける場所はどこでも同じです。クラス、インスタンス、モジュールなど、好きなものに属性を動的に追加できます。それが動的型付け言語であるということです。

実際、このようにすることがインスタンス変数を定義する唯一の方法です。私が言ったように、i上記はクラスのすべてのメンバーによって共有されるクラス属性です。インスタンスレベルの変数を取得する唯一の方法は、通常はメソッド内で「動的に」追加すること__init__ですが、好きな場所で行うことができます。

于 2012-07-21T21:37:30.323 に答える
4

これは、スクリプト言語からよくあることです。Python はそれを可能にし、Ruby も同様です。実際には、ローカル変数を事前に定義する必要はありませんでした。あなたのクラスにも参加してみませんか?それだけでなく、新しく挿入された変数/関数が 1 つのオブジェクトのみに影響するか、そのクラスのすべてのインスタンスに影響するかを選択できます。

TDD やUnitTestingで重いことをしている人々は、その誤機能が大好きです。実際、C++ の静的型付けは、単体テストを容易にする言語ほどプログラムのバグを減らしません。

ただし、心配な場合は、いつでも_____スロット_____を使用できます

https://stackoverflow.com/a/3603624/253098

于 2012-07-21T22:19:35.120 に答える
2

これがPythonの仕組みです。クラスまたはインスタンスに自由に新しい属性を作成できます。コンパイル時に多くのエラーをキャッチできないという欠点がありますが、より柔軟な動的プログラミングが可能になるという利点があります。

この動作に驚いた場合は、Python チュートリアルを読んで Python の基本を理解してください。

于 2012-07-21T21:36:04.647 に答える