7

Python で変数を定義すると、次のようになります。

my_var = (1,2,3)

__init__クラスの関数でアクセスしてみてください:

class MyClass:
    def __init__(self):
        print my_var

my_var(global my_var) を指定せずにアクセスして印刷できます。

my_varただし、直後に配置するclass MyClassと、スコープエラーが発生します(no global variable found)

これの理由は何ですか?どうすればいいですか?これについて学ぶためにどこで読むことができますか? Python クラスのページを読みましたが、その説明に遭遇しませんでした。

ありがとうございました

4

4 に答える 4

12

@mgilson の回答を補足する: Python クラス変数はクラス インスタンス間で共有されることに注意してください。そして、その動作は非常に予想外で、奇妙に見えるかもしれません。実際には、次のように機能します。

class MyClass(object):
    my_var = 10

    def __init__(self):
        print(self.my_var)


m1 = MyClass()
print(m1.my_var)
>>> 10          # this is fine

MyClass.my_var = 20
print(m1.my_var)
>>> 20          # WTF? :) --> shared value

m2 = MyClass()
print(m2.my_var)
>>> 20          # this is expected

m1.my_var = 30
print(MyClass.my_var)
>>> 20          # this is also expected

MyClass.my_var = 40 
print(m1.my_var)
>>> 30           # But WHY? Isn't it shared? --> 
                 # The value WAS shared until m1.my_var = 30 has happened.

print(m2.my_var)
>>> 40           # yep m2.my_var's value is still shared :)
于 2012-10-17T19:42:13.730 に答える
11

の直後に配置すると、クラス属性になり、クラス内から、またはクラス内からclass MyClassアクセスできます(同じ名前のインスタンス変数を作成しない場合)。MyClass.my_varself.my_var

ここに小さなデモがあります:

my_var = 'global'
class MyClass(object):
   my_var = 'class' 
   def __init__(self):
      print my_var #global
      print MyClass.my_var #class
      print self.my_var #class -- Only since we haven't set this attribute on the instance
      self.my_var = 'instance' #set instance attribute.
      print self.my_var #instance
      print MyClass.my_var #class
于 2012-10-17T19:20:17.850 に答える
2

あなたが書く場合:

class MyClass(object):
    my_var = (1, 2, 3)

MyClass変数ではなく、の属性を定義しています。あなたの__init__方法では、それはMyClass.my_varです。

于 2012-10-17T19:21:09.600 に答える
1

定義内に入ると、classグローバルではなくなり、クラス オブジェクトの名前空間に入ります。self.my_varただし、内でアクセスできます__init__...

于 2012-10-17T19:20:58.993 に答える