2011-06-25 22 views
22

Pythonでクラススコープを持つグローバル変数を定義する適切な方法は何ですか?私はこれが正しいことを前提とC/C++/Javaの背景から来るグローバル変数Pythonクラス

:あなたはそれがグローバルコールしないでしょうが

class Shape: 
    lolwut = None 

    def __init__(self, default=0): 
     self.lolwut = default; 
    def a(self): 
     print self.lolwut 
    def b(self): 
     self.a() 
+4

間違って次のようになります。shape.lolwutが、それは、インスタンスレベルを設定しますようにそれを設定する際に注意することは

class Shape(object): lolwut = 1 shape = Shape() print Shape.lolwut, print shape.lolwut, # setting shape.lolwut would not change class attribute lolwut # but will create it in the instance shape.lolwut = 2 print Shape.lolwut, print shape.lolwut, # to change class attribute access it via class Shape.lolwut = 3 print Shape.lolwut, print shape.lolwut 

出力クラス属性がない属性答えは以下のように正しいです。 – Clintm

答えて

53

何を持っていることは、正しいこと、それはクラス属性で、アクセスすることができますクラスを介して、例えばShape.lolwutを介して、またはインスタンス

1 1 1 2 3 2 

誰かが出力さ1 1 2 2 3 3ことを期待かもしれませんが、場合、それは

+1

私はあなたの例をPython 2.7でテストします。それは大丈夫です。しかし、最初にShape.lolwutに値を設定すると、インスタンスの値が変更されます。インスタンス属性に値を設定すると、例のようにクラスレベルの値を変更しても、2つの値は同じになりません。 – x4snowman

+0

@ダンユン私は同様にテストしました。私はあなたが言及したのと同じ状況を見ました。それがどうして起こるのか知っていますか?クラスレベルから属性を変更すると、インスタンスも変更されます。しかし、最初にインスタンスレベルを変更し、クラスレベルから変更すると、インスタンスに再度影響しません。 – user1167910

+0

@ user1167910 pythonのドキュメントhttps://docs.python.org/2.7/reference/datamodel.htmlを参照してください。「属性の割り当てと削除でインスタンスの辞書が更新され、クラスの辞書は更新されません」 – x4snowman

関連する問題