2017-08-25 95 views
-3

我一直在閱讀python教程,並簡要討論了屬性。據我所知,當請求一個類屬性時,python將請求引導到返回該屬性的屬性方法,以便代碼可以在該屬性被訪問之前運行。但爲什麼這是必要的,在下面的例子中,返回的屬性v甚至不能用點符號訪問?爲什麼我應該在python中使用@property裝飾器?

@property 
def value(self): 
    if self.is_face_up: 
     v = BJ_Card.RANKS.index(self.rank) + 1 
     if v > 10: 
      v = 10 
    else: 
     v = None 
    return v 
+2

_「返回的屬性甚至不能用點符號訪問」_你是什麼意思? 'YourClass().value'工作得很好。 –

+0

是的,我現在意識到你可以在方法上使用點符號 - 像變量v一樣處理它。當我寫這個問題時,我很困惑,因爲我無法通過鍵入MyClass.v來獲得變量v,但現在我知道這是不必要的,因爲您可以調用該方法。 –

回答

1

的屬性不能用點號訪問功能內,因爲這將遞歸調用屬性getter和導致堆棧溢出:

class A: 
    @property 
    def x(self): 
     return self.x # StackOverflow 

然而,@property的整點,確切地說是,以便用點符號表示。以下是等效的:

# Without @property 
class A: 
    def x(self): 
     return 3 

a = A() 
print(a.x()) # prints 3 

# With @property 
class A: 
    @property 
    def x(self): 
     return 3 

a = A() 
print(a.x) # prints 3 
+0

所以,僅僅爲了澄清一下,當你使用屬性裝飾器時,你將該方法看作屬性。它只是爲類創建屬性的一種方式,但它可以被控制? –

+1

@IsaacJohnson:是的,@ @ property將屬性訪問轉換爲方法調用,使屬性成爲動態的。 –

+0

謝謝,我感到非常困惑,但你真的爲我清理了一些東西。 :) –

相關問題