ここには、一貫性のないPython(3.6)動作を示す簡単なファイルがあります。なぜCase 1
とCase 2
が実行されますが、Case 3
が最初の2つのケースの合併に過ぎないのに、Case 3
が失敗するのはなぜですか?プロパティデコレータを使用したときのPythonの動作が不一致
私はdis
の最初の2つのケースの出力を提供しました。
import dis # Python bytecode disassembler
class A(object):
def __init__(self):
self.x # In case 2, getting x results in a function call.
# CASE 1: Legal
def x(self):
y
pass
'''
# CASE 2: Legal
@property
def x(self):
pass
'''
'''
# CASE 3: Illegal:
@property
def x(self):
y
pass
'''
if __name__ == '__main__':
a = A()
dis.dis(A)
ケース1つのバイトコード:
Disassembly of __init__:
5 0 LOAD_FAST 0 (self)
2 LOAD_ATTR 0 (x)
4 POP_TOP
6 LOAD_CONST 0 (None)
8 RETURN_VALUE
Disassembly of x:
9 0 LOAD_GLOBAL 0 (y)
2 POP_TOP
10 4 LOAD_CONST 0 (None)
6 RETURN_VALUE
ケース2バイトコード:
Disassembly of __init__:
5 0 LOAD_FAST 0 (self)
2 LOAD_ATTR 0 (x)
4 POP_TOP
6 LOAD_CONST 0 (None)
8 RETURN_VALUE
と同じエラーを得た、あなたは何を呼び出していません。 'self.x'は使われていない関数参照です。ケース3の場合、 'self.x'は' x'の定義済みのゲッターを実際に呼び出します。おそらく未定義のグローバル名にアクセスしようとしています。 – chepner
つまり、「関数呼び出しでx結果を得る」というコメントは間違っています。これは、あなたが呼ぶことを怠る関数オブジェクトに評価されます。 –
コメントした行は、この投稿にコメントをつけたものではありませんでした。私が間違っていないとすれば、ケース2のコメントが外され、他のものがコメントアウトされていれば、ラインが適用されると思います。 – awalllllll