8

外部関数でクラス変数にアクセスしようとしていますが、「クラスには属性がありません」という AttributeError が表示されます。コードは次のようになります。

class example():
     def __init__():
          self.somevariable = raw_input("Input something: ")

def notaclass():
    print example.somevariable

AttributeError: class example has no attribute 'somevariable'

これに似た他の質問が尋ねられましたが、すべての回答は self を使用し、init中に定義すると言われました。この変数にアクセスできないのはなぜですか。

4

2 に答える 2

19

クラス変数を作成する場合は、クラス メソッドの外側で宣言する必要があります (ただし、クラス定義の内側で宣言する必要があります)。

class Example(object):
      somevariable = 'class variable'

これで、クラス変数にアクセスできるようになりました。

>> Example.somevariable
'class variable'

例が機能しない理由は、instance変数に値を割り当てているためです。

2 つの違いはclass、クラス オブジェクトが作成されるとすぐに変数が作成されることです。一方、instance変数は、オブジェクトがインスタンス化され、割り当てられた後にのみ作成されます。

class Example(object):
      def doSomething(self):
          self.othervariable = 'instance variable'

>> foo = Example()

ここでは のインスタンスを作成しましたがExample、アクセスしようとするothervariableとエラーが発生します。

>> foo.othervariable
AttributeError: 'Example' object has no attribute 'othervariable'

othervariableは内部で割り当てられているためdoSomething(そして、ityet を呼び出していないため)、存在しません。

>> foo.doSomething()
>> foo.othervariable
'instance variable'

__init__クラスのインスタンス化が発生するたびに自動的に呼び出される特別なメソッドです。

class Example(object):

      def __init__(self):
          self.othervariable = 'instance variable'

>> foo = Example()
>> foo.othervariable
'instance variable'
于 2013-05-21T22:07:06.203 に答える
13

クラス属性とそうでないものについて少し混乱しています。

  class aclass(object):
      # This is a class attribute.
      somevar1 = 'a value'

      def __init__(self):
          # this is an instance variable.
          self.somevar2 = 'another value'

      @classmethod
      def usefulfunc(cls, *args):
          # This is a class method.
          print(cls.somevar1) # would print 'a value'

      def instancefunc(self, *args):
          # this is an instance method.
          print(self.somevar2) # would print 'another value'

  aclass.usefulfunc()
  inst = aclass()
  inst.instancefunc()

クラス変数は常にクラスからアクセスできます。

print(aclass.somevar1) # prints 'a value'

同様に、すべてのインスタンスはすべてのインスタンス変数にアクセスできます。

print(inst.somevar2) # prints 'another value'
于 2013-05-21T22:04:21.110 に答える