一般来说,实例变量用于对每一个实例都是唯一的数据,类变量用于类的所有实例共享的属性和方法:
1 class Dog(object): 2 kind = 'canine' #类变量用于类的所有实例共享的变量 3 def __init__(self,name): 4 self.name = name #实例变量用于对每一个实例都是唯一的数据 5 6 d = Dog('Fido') 7 e = Dog('Buddy') 8 9 print("d.kind: %s"%d.kind) #所有实例共享 10 print("e.kind: %s"%e.kind) #所有实例共享 11 print("d.name: %s"%d.name) #不同实例,值不同 12 print("e.kind: %s"%e.name) #不同实例,值不同
显示结果:
d.kind: canine
e.kind: canine
d.name: Fido
e.kind: Buddy
正如在名称和对象讨论的,可变对象,例如列表和字典,的共享数据可能带来意外的效果。例如,下面代码中的tricks 列表不应该用作类变量,因为所有的Dog 实例将共享同一个列表:
1 class Dog: 2 3 tricks = [] # 错误的适用类变量 4 5 def __init__(self, name): 6 self.name = name 7 8 def add_trick(self, trick): 9 self.tricks.append(trick) 10 11 >>> d = Dog('Fido') 12 >>> e = Dog('Buddy') 13 >>> d.add_trick('roll over') 14 >>> e.add_trick('play dead') 15 >>> d.tricks # 所有实例共享了该属性 16 ['roll over', 'play dead']
这个类的正确设计应该使用一个实例变量:
1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 self.tricks = [] #为每一个实例创建一个空的列表 5 def add_trick(self,trick): 6 self.tricks.append(trick)