python中下面的代码声明之间有什么区别?

时间:2017-03-26 06:18:10

标签: python

在python中如果我在其他方法中使用的任何类方法之外的变量,如果我使用自己的 init 方法它基本上做同样的(或看起来)可以任何人解释它们之间的区别。当它适合使用任何一种方法时

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()

1 个答案:

答案 0 :(得分:0)

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

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

将类属性与静态类型语言中的静态变量进行比较,如C ++,JAVA等。 类属性由类的所有实例共享,因此只生成这些属性的一个副本(与实例中每个类的实例都有自己的实例变量副本的属性不同)。

当创建类something的实例时,执行something的{​​{1}}方法,在其__init__参数中接收新实例。此方法创建两个实例属性:selfvalue1。然后将此实例分配给实例变量,因此它绑定到具有这两个实例属性的事物。

例如:

value2

对于此类定义,当我们创建2个类实例时:

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

    Blist=[]             #It is a class attribute

var1 = foo() var2 = foo() 属性由Blistvar1共享,但var2属性对于它们都不同。因此,如果我们操作以下内容:

Alist

的输出
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共享了var1变量,因此var2中的变化会影响var1.Blist,反之亦然。 但是,var2.Blistvar1.Alist相互独立。

因此,如果您希望某个属性对该类的所有实例都是通用的,那么您将其声明为类属性(如果不是通常需要的话),否则您可以将其声明为实例属性。