在python中,如果我在任何类方法之外使用变量,它可以在其他方法中使用,如果我将init方法与self一起使用,它基本上可以做同样的事情(或者看起来)任何人都可以解释它们之间的区别。 以及何时适合使用其中任何一种方法
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()
直接在类中声明的属性称为类属性。 就像在你的例子中一样(尽管缩进和一些语法是错误的),value1、value2 和 value3 是类 gaurab 的类属性。
在其他属性中声明的属性是实例属性,并绑定到在其中声明它们的类属性。 就像 value1 和 value2 变量绑定到类中初始化一样。
类属性与静态类型语言中的静态变量(如C++、JAVA等)进行比较。 类属性由类的所有实例共享,因此只创建此类属性的一个副本(与实例属性不同,其中类的每个实例都有自己的实例变量副本)。
当创建类something
的实例时,将执行something
的__init__
方法,在其self
参数中接收新实例。此方法创建两个实例属性:value1
和value2
。然后将此实例分配给实例变量,因此它绑定到具有这两个实例属性的事物。
例如:
class foo:
def __init__(self):
self.Alist=[] #It is an instance attribute
Blist=[] #It is a class attribute
对于这个类定义,当我们创建 2 个类实例时:
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
和var2.Alist
是相互独立的。
因此,如果您希望一个属性对于类的所有实例都是通用的,则可以将其声明为类属性(如果不是经常需要的),则可以将其声明为实例属性。