2017-03-26 51 views
0

在python中,如果我在其他方法中使用任何类方法以外的变量,并且如果我使用初始值方法与自身基本相同(或因为它似乎)任何人都可以解释它们之间的区别。并且适合使用任何一种方法Python中的以下代码段声明有什么区别

class gaurab(): 
    value1=1 
    value2=2 
    value3=3 

values=gaurab() 

class something(): 
    def __init__(self): 
     self.value1=1 
     self.value2=100 
    def p(self): 
     print self.value1 

svalues=something() 

print values.value1 

print svalues.p() 
+0

您的缩进是错误的!你也想看看这里:http://stackoverflow.com/questions/8959097/what-is-the-difference-between-class-and-instance-variables-in-python – elena

回答

0

在类中直接声明的属性称为类属性。 和你的例子一样(尽管缩进和一些语法是错误的),value1,value2和value3是类gaurab的类属性。

在其他属性中声明的属性是实例属性,并绑定到声明它们的类属性。 像value1和value2变量绑定到init在类的东西。

将类属性与在静态类型语言中发现的静态变量(如C++,JAVA等)进行比较。 类属性由类的所有实例共享,因此只有这样的属性的一个副本被创建(例如,类的实例拥有自己的实例变量副本)。

当生成something类的实例时,会执行something__init__方法,并在其参数self中接收新实例。此方法创建两个实例属性:value1value2。然后这个实例被分配到实例变量中,所以它被绑定到具有这两个实例属性的事物上。

例如:

class foo: 
    def __init__(self): 
     self.Alist=[] #It is an instance attribute 

    Blist=[]    #It is a class attribute 

对于这个类定义,当我们创建作为2类实例:

var1 = foo() 
var2 = foo() 

Blist属性由两个var1var2Alist属性共享为不同两个都。所以,如果我们操作如下:

var1.Alist.append(1) 
var1.Blist.append(10) 
var2.Alist.append(2) 
var2.Blist.append(20) 

print(var1.Alist) 
print(var1.Blist) 
print(var2.Alist) 
print(var2.Blist) 

输出将是:

[1] 
[10] 
[2] 
[10,20] 

这是因为Blist变量同时受var1var2所以共享,变化在var1.Blist受影响var2.Blist,反之亦然。 但是,var1.Alistvar2.Alist是彼此独立的。因此,如果你想要一个属性对于所有类的实例是共同的,那么你将它声明为类属性(如果不是常常需要的话),你可以声明它为实例属性。