2014-10-29 97 views
1

我想要一個類變量,以便該值可以在所有實例中都可以訪問,但是我也想訪問該類中的方法中的變量。那可能嗎?我已經嘗試過,但完全沒有效果。所有類方法中的類變量訪問

class myClass: 
    myvariable = 1 

    def add(): 
     myvariable+= 1 

    def print1(): 
     print myvariable 

我想讓兩個實例,一個只能做添加方法,其他的只能做PRINT1方法

回答

6

是的,只是訪問類對象的變量:

class myClass(object): 
    myvariable = 1 

    def add(self): 
     myClass.myvariable += 1 

    def print1(self): 
     print myClass.myvariable 

,或者要設置每個子類中,使用type(self)

class myClass(object): 
    myvariable = 1 

    def add(self): 
     type(self).myvariable += 1 

    def print1(self): 
     print type(self).myvariable 

不同的是THA t後者將在設置時在任何子類上創建單獨的屬性,從而屏蔽基類屬性。這就像在實例上設置屬性會掩蓋類屬性一樣。

雖然可以通過得到self類屬性以及(print self.myvariable),明確優於隱式在這裏,並且避免被意外同名的實例屬性掩蓋。設置類屬性總是必須在類上完成;將其設置爲self將創建或更新實例屬性,而不是共享。

儘管繼承了object的類,使用新式課程有很多優點,但至少type(self)將實際返回課程。在舊式課程中(不是從object繼承),您必須改用self.__class__

使用object作爲基礎也給你第三種選擇,類方法與@classmethod decorator;當你只需要訪問類對象而不是實例時使用它們。這些方法綁定到當前(亞)類的,所以他們的階級屬性的效果是一樣的使用type(self)

class myClass(object): 
    myvariable = 1 

    @classmethod 
    def add(cls): 
     cls.myvariable += 1 

    @classmethod 
    def print1(cls): 
     print cls.myvariable 
+0

不要忘了你的方法'self'? – 2014-10-29 09:36:57

+0

@MauroBaraldi:我確實。 – 2014-10-29 09:45:41

+0

或者,更容易,你可以通過'self'訪問類變量。 – Marcin 2014-10-29 09:56:31