2017-03-10 2 views
0

私はPythonには初めてです。私は次のコードを実行していましたが、望ましくない結果に出会った。私のコードに見て、私は私が間違って何をやっているお聞かせください: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 

として出力を得ます。 classmethodとして__init__を設定

+3

'' __init__'の@ classmethod'があります? –

+0

@WillemVanOnsem良い点!それは答えのBTWです。クラスメソッドは使用しないでください。デコレータを削除してください。 –

+0

か、それともピッタンで違うかもしれません。 –

答えて

2

あなたはを__init__の機能に添付しています。あなたは__init__呼び出す場合、結果として、(何かをあなたが構築でを行う)、selfは、あなたが構築しようとしているオブジェクトへの参照はありませんが、class、そうTestClass。したがって、の1つだけvalueTestClassに添付されています。

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を使用するのではなく奇妙です:あなたは@classmethodデコレータを削除することで問題を解決することができ

のでTestClass(3)TestClass.__init__(TestClass,3)のようなものと同等になります...方法。クラスに属性を追加する場合は、type(..)を使用できます。だから、:

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

は同等です:

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

は、インスタンス変数を、あなたが実際に__init__self.valにクラスを渡しているが、実際にクラス変数として設定されている意味ない

実行する最後の「初期化」は、設定した他のすべての値を上書きします。

@classmethodを削除すると、問題が解決されます。

関連する問題