这里会发现t1对ID进行了修改却影响了t2的ID, 这就说明ID属于Test类,而非它的对象,换句话说这个属性是全体Test实例共用的。这是因为self的意思同c++的this指针,它代表了类当前的实例,所以加了self的属性就是类实例的属性,不加就是类的属性,这同c++中静态类变量的含义是一样的。
class Test(object):
ID = 1
def __init__(self):
pass
def prtID(self):
print(self.ID)
def classplusOne(self):
Test.ID += 1
def ObjplusOne(self):
self.ID += 1
t1 = Test()
t2 = Test()
t1.classplusOne()`
在下面的代码中,在函数classplusOne里面,没有用类的的ID,而是使用的对象的ID,两个类对象不影响。
class Test(object):
ID = 1
def __init__(self):
pass # self.ID = 1
def prtID(self):
print(self.ID)
def classplusOne(self):
self.ID += 1
def ObjplusOne(self):
self.ID += 1
t1 = Test()
print(t1.ID)
t2 = Test()
print(t2.ID)
t1.classplusOne()
print(t1.ID)
print(t2.ID)
方法中加self的变量可以看成是类的属性,或者是特性。使用方法改变和调用属性,属性改变实例的状态。方法中不加self的变量可以看成一个局部变量,该变量不能被直接引用。
类本身的局部变量(定义在方法以外不以self开头的变量是类本身的局部变量)是可以被直接掉用的,注意这里不是指上面所说的方法内的局部变量(这两个命名空间不同)。如果方法中有有变量与类的局部变量同名,那么方法中的局部变量将会屏蔽类中的局部变量即类中的局部变量不在起作用。
class AAA(object):
def go(self):
self.one = 'hello'
class BBB(object):
def go(self):
one = 'hello'
a1 = AAA()
a1.go()
a1.one
a2 = AAA()
a2.go()
a2.one
b1 = BBB()
b1.go()
b1.one
self.xxx是全局的,xxx是局部的对于该方法有效,类里面属于类的内部变量