下面是描述某些不一致的Python(3.6)行爲的簡單文件。爲什麼Case 1
和Case 2
運行,但Case 3
失敗,儘管Case 3
只是前兩種情況的合併?使用屬性裝飾器時Python中的行爲不一致
我提供了前兩種情況下的dis
輸出。
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
在案例1,你是不是叫什麼; 'self.x'是一個未使用的函數引用。在情況3中,'self.x'實際上調用了定義的'x'的getter,它可能會試圖訪問一個未定義的全局名稱。 – chepner
換句話說,您的評論「讓x導致函數調用」不正確。它評估爲一個你忽略調用的函數對象。 –
該評論行不應該成爲這篇文章。如果我沒有弄錯,我認爲如果案例2未被註釋並且其他註釋掉了,那麼這條線就會適用。 – awalllllll