理解python中类的输出

理解python中类的输出,python,class,oop,object,Python,Class,Oop,Object,我是一名编程初学者,已经开始使用Python。我正在运行以下代码。请向我解释输出的序列流 class Employee: empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary self.empCount += 1 def displayEmployee(self): print "Name : ", self.n

我是一名编程初学者,已经开始使用Python。我正在运行以下代码。请向我解释输出的序列流

class Employee:
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      self.empCount += 1

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

emp1 = Employee("ABC", 2000)
emp2 = Employee("DEF", 5000)

print "Total Emp   : %d" % Employee.empCount
print "Total Emp1 : %d" % emp1.empCount
print "Total Emp2: %d" % emp2.empCount
我得到以下输出:

Total Emp  : 0
Total Emp1 : 1
Total Emp2: 1
至此,仅显示Employee.empCount的总Emp仍为0

 def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      self.empCount += 1
这将继承并定义Employee,并添加self.empcount。结果,empCount增加1

emp1 = Employee("ABC", 2000)
emp2 = Employee("DEF", 5000)

emp1和emp2是单独的对象,分别受init的影响,这使得emp1计数为1

您正在使用扩充赋值。对于不可变类型(如整数),您实际上执行的操作与此相同:

self.empCount
检索实例属性(如果存在)或类属性。因为没有这样的实例属性,所以检索的是class属性(设置为
0
),而
1
被分配给
self.empCount
。对实例属性的赋值总是设置实例属性,而不是类属性。因此,每个实例的
self.empCount
都设置为
1
,并且class属性永远不会更改

请注意,即使
empCount
是一种可变类型,如列表,赋值也会给您一个实例属性,即使增广赋值也会改变class属性。请参阅对不存在的实例属性执行增强分配很少是一个好主意,因为增强分配执行以下操作:

self.empCount = self.empCount.__iadd__(1)
注意
self.empCount
属性的显式赋值

如果要增加class属性,则需要显式执行此操作:

Employee.empCount += 1

你到底不明白什么?有一件事可能会让您大吃一惊,那就是
self.empCount+=1
正在分配一个实例属性,使用相同名称的class属性,然后对其进行阴影处理,这就是为什么最后一行没有显示
2
。这并不能真正解释原因。你知道实例属性和类属性之间的区别吗?这不是对实例属性的赋值吗?那么为什么它不改变类属性呢?毕竟,OP使用了增广赋值。为什么输出不是
2
1
2
self.empCount = self.empCount.__iadd__(1)
Employee.empCount += 1