これが理由属性検索はPythonで動作する方法を許可し、これは仕様によるものです。 Pythonでは、他の言語では推奨されない、禁じられている、または不可能な多くの事柄がユースケースを活用することができます(賢明に使用される場合)。もちろん、より多くのパワーは、より多くの責任を意味します。
After all, we're all consenting adults here.
クラスのインスタンスは、すべてのオブジェクト属性が格納されている空の__dict__
属性で始まる属性解像度のいくつかの背景情報。x.someFunction
にアクセスすると、暗黙のうちにx.__dict__['someFunction']
が試行されます。 'someFunction'
がx.__dict__
に存在しない場合は、type(x).someFunction
以上のtype(x).__dict__['someFunction']
のように、x
のクラスに対しても同じことが試されます。
を書いてx.someFunction = 3
とすると、実際に何が起こるかは、読書属性のアクセスが何を返すかにかかわらず、x.__dict__['someFunction'] = 3
です。
のみ実際の(?)マジックself
が自動的に提供されたメソッドの呼び出し中に発生し、すなわちx.someFunction(4)
type(x).__dict__['someFunction'](4)
代わりに又はx.__dict__['someFunction'](4)
のtype(x).__dict__['someFunction'](x, 4)
に解決されます。これは属性へのアクセスに多少の関係があり、混乱を招く可能性があります。
実際には関数を「再バインド」しませんが、クラス属性someFunction
をインスタンス属性someFunction
をx
で非表示にします。実行した場合、
print(MyClass.someFunction)
print(MyClass().someFunction)
が表示されます。あなたも
del x.__dict__['someFunction']
注意して初期状態に戻すことができます。私は、解像度として説明物事は概念を説明します。実際には、Pythonの内部動作はより微妙で複雑かもしれませんが、同じ効果があります。例えば、Python 2では、メソッドは、というバインドされていないメソッドとしてラップされています。がクラス辞書に格納されています。 This has been dropped in Python 3ここで、クラス辞書にはプレーン関数が含まれています。
メソッドは単に呼び出し可能な属性です。それでおしまい。 Pythonは非常に動的な言語であり、名前(属性名を含む)は型付けされていません。 – jonrsharpe
通常、関数の名前は変数名とは十分に異なり、リスクが最小限に抑えられています。例えば、あなたの関数は 'someFunction'と呼ばれます。誤って値を割り当てようとすることはほとんどありません。 –