8

我正在尝试访问外部函数中的类变量,但是我得到了 AttributeError,“类没有属性” 我的代码看起来像这样:

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

def notaclass():
    print example.somevariable

AttributeError: class example has no attribute 'somevariable'

已经提出了与此类似的其他问题,但是所有答案都说在init期间使用 self 和 define ,我这样做了。为什么我不能访问这个变量。

4

2 回答 2

19

如果要创建类变量,则必须在任何类方法之外声明它(但仍在类定义内):

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

有了这个,您现在可以访问您的类变量。

>> Example.somevariable
'class variable'

您的示例不起作用的原因是您正在为instance变量赋值。

两者的区别在于,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 回答