在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()
答案 0 :(得分:0)
在类中直接声明的属性称为类属性。 就像在你的例子中一样(虽然缩进和一些语法是错误的),value1,value2和value3是类gaurab的类属性。
在其他属性中声明的属性是实例属性,并绑定到声明它们的class属性。 就像value1和value2变量绑定到类中的 init 一样。
将类属性与静态类型语言中的静态变量进行比较,如C ++,JAVA等。 类属性由类的所有实例共享,因此只生成这些属性的一个副本(与实例中每个类的实例都有自己的实例变量副本的属性不同)。
当创建类something
的实例时,执行something
的{{1}}方法,在其__init__
参数中接收新实例。此方法创建两个实例属性:self
和value1
。然后将此实例分配给实例变量,因此它绑定到具有这两个实例属性的事物。
例如:
value2
对于此类定义,当我们创建2个类实例时:
class foo:
def __init__(self):
self.Alist=[] #It is an instance attribute
Blist=[] #It is a class attribute
var1 = foo()
var2 = foo()
属性由Blist
和var1
共享,但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.Blist
和var1.Alist
相互独立。
因此,如果您希望某个属性对该类的所有实例都是通用的,那么您将其声明为类属性(如果不是通常需要的话),否则您可以将其声明为实例属性。