python:类变量和实例变量

时间:2013-08-08 03:49:24

标签: python static-members instance-variables

python如何识别类和实例级变量?他们有什么不同吗?

For example,

class abc:
    i = 10
    def __init__(self, i):
        self.i = i


a = abc(30)
b = abc(40)
print a.i
print b.i
print abc.i

output
--------
30
40
10

意味着,在上面的示例中,当我访问a.i (or b.i)abc.i时,他们指的是完全不同的变量?

3 个答案:

答案 0 :(得分:2)

  

在上面的示例中,当我访问a.i(或b.i)和abc.i时   指的是完全不同的变量?

abc.i是Class Object参考。

a.i和b.i是Instance Object个引用。

它们都是单独的参考文献。

答案 1 :(得分:2)

首先,如果__init__中只有自我,则无法初始化实例,因此您的示例有误。

>>> class abc:
...     i = 10
...     j = 11
...     def __init__(self, x):
...             self.i = x

然后,当您访问实例上的属性时,它将首先检查实例变量。请参阅paragraph here。如你所知:

>>> a = abc(30)
>>> a.i
30
>>> a.j
11

此外,类变量是所有实例共享的对象,实例变量由实例拥有:

>>> class abc:
...     i = []
...     def __init__(self, x):
...             self.i = [x]
...             abc.i.append(x)
... 
>>> a = abc(30)
>>> b = abc(40)
>>> a.i
[30]
>>> b.i
[40]
>>> abc.i
[30, 40]

答案 2 :(得分:1)

这就是假设你的init应该是:

def __init__(self,i):

其他方面它不起作用。在第三种情况下,abc.i该类尚未初始化,因此我充当一个静态变量,您可以在类定义中将值设置为10。在前两个实例中,当您调用init时,您创建了一个具有特定i值的abc实例。当您询问每个实例的i值时,您会得到正确的数字。