2017-03-10 24 views
0

我是新來python.I在做下面的代碼,我遇到了一個不想要的結果類變量。請看在我的代碼,讓我知道我在做什麼錯:問題可以用Python

class TestClass(object): 
    @classmethod 
    def __init__(self, val): 
    self.val = val 

    @classmethod 
    def value(self): 
    return self.val 

def Test(): 
    a = TestClass(9) 
    b = TestClass(8) 
    c = TestClass(7) 
    print(a.value(), b.value(), c.value()) 

期待輸出

9 8 7 

但得到輸出

7 7 7 

什麼是錯我的代碼。

+3

'__init__'是'@ classmethod' ??? –

+0

@WillemVanOnsem好點!這就是答案。不應該使用classmethod,刪除裝飾器。 –

+0

或者它在pythan中可能不同。 –

回答

2

您已連接@classmethod__init__功能。其結果是,如果調用__init__(你在建設做self不會提及您要構造對象,但class,所以TestClass。因此,只有一個value:連接到TestClass

所以TestClass(3)將等同於像TestClass.__init__(TestClass,3) ...

您可以通過刪除@classmethod裝飾解決問題:

class TestClass(object): 

    def __init__(self, val): # no @classmethod 
    self.val = val 

    def value(self): # no @classmethod 
    return self.val 

def Test(): 
    a = TestClass(9) 
    b = TestClass(8) 
    c = TestClass(7) 
    print(a.value(), b.value(), c.value())

它實際上是相當怪異上__init__使用@classmethod方法。如果您想爲課程添加屬性,您可以使用type(..)。所以:

@classmethod 
def __init__(cls, val): 
    cls.val = val 

等同於:

def __init__(self, val): 
    type(self).val = val 
7

設置__init__作爲classmethod意味着你實際上是在傳遞類__init__self.val實際上是設置爲類變量,實例變量。

最後的「初始化」執行將覆蓋所有已設置其他值。

卸下@classmethod小號修復該問題。