不同的类变量和用法

时间:2014-04-04 08:01:37

标签: python global-variables class-variables

在Python的一个类中,有几种方法可以为变量赋值 我一直不知道应该在哪里做,使用的区别是什么,在哪种情况下我应该使用不同的变体。

class Class(object):
    NUMBER = 31415
    foo = 'FOO'

    def __init__(self):
        self.foobar = 'foobar'

2 个答案:

答案 0 :(得分:3)

类变量在类的所有实例之间共享。事实证明这是不言自明的。然而,实例变量是每个实例化对象的本地变量。

这是一个例子,首先我们实例化一堆类。

In [19]: classes = [Class() for _ in range(5)]

In [20]: classes
Out[20]: 
[<__main__.Class at 0x20bb290>,
 <__main__.Class at 0x20bb2d0>,
 <__main__.Class at 0x20bb310>,
 <__main__.Class at 0x20bb350>,
 <__main__.Class at 0x20bb4d0>]

然后我们更改了NUMBER

Class - 变量
In [21]: Class.NUMBER = "Hah!"

In [22]: print [x.NUMBER for x in classes]
['Hah!', 'Hah!', 'Hah!', 'Hah!', 'Hah!']

但是,一旦您实例化了对象,就可以更改x.NUMBER,一旦您执行了更改, 就是该对象的本地对象。我明白这可能会令人困惑。

因为我们甚至无法触及foobar - 值,因为它在对象实例化之前不存在:

In [23]: Class.foobar
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-23-c680e41ebe07> in <module>()
----> 1 Class.foobar

AttributeError: type object 'Class' has no attribute 'foobar'

这与类属性是大写还是小写无关。我们也可以访问Class.foo。关键是__init__之前的所有内容都存在之前该类被实例化为一个对象。将该类实例化为对象后,该对象将具有实例属性,即obj.foobar

答案 1 :(得分:1)

类变量对于2个实例具有相同的值,但实例变量将为每个实例具有差异值。