Python中类变量的使用

Python中类变量的使用,python,oop,Python,Oop,我试图学习python类,我试图学习类变量是如何工作的。当我执行下面的代码时,我看到了这个错误。我只是想理解为什么python会抱怨“Employee”这个名字。当我在\uuuu init\uuuu方法中将语句移动到Employee.employeecount=Employee.employeecount+1时,我看到它没有抱怨。有人能帮我理解到底发生了什么吗 非工作代码: class Employee(object): employeecount = 0 Employee.e

我试图学习python类,我试图学习类变量是如何工作的。当我执行下面的代码时,我看到了这个错误。我只是想理解为什么python会抱怨“Employee”这个名字。当我在
\uuuu init\uuuu
方法中将语句移动到
Employee.employeecount=Employee.employeecount+1
时,我看到它没有抱怨。有人能帮我理解到底发生了什么吗

非工作代码:

class Employee(object):

    employeecount = 0
    Employee.employeecount = Employee.employeecount + 1

    def __init__(self,name,salary):
        self.name = name
        self.salary = salary

    def getdata(self):
        self.salary += 1
        print "Employee name: %s \nEmployee Salary: %d" % (self.name,self.salary)

    def getname(self):
        return self.name

    def getsalary(self):
        return self.salary

emp1 = Employee('Pradeep',8000)
emp1.getdata()

emp2 = Employee('Maddy',9000)
emp2.getdata()

print "Employee Count is %d" % Employee.employeecount
print "Employee Count is %d" % Employee.employeecount

name = emp1.getname()
salary = emp1.getsalary()

print "Name is %s and salary is %d" % (name,salary)
python classes.py

Traceback (most recent call last):
  File "classes.py", line 4, in <module>
    class Employee(object):
  File "classes.py", line 6, in Employee
    Employee.employeecount = Employee.employeecount + 1
NameError: name 'Employee' is not defined
回溯(最近一次呼叫最后一次):
文件“classes.py”,第4行,在
类别雇员(对象):
文件“classes.py”,第6行,在Employee中
Employee.employeecount=Employee.employeecount+1
NameError:未定义名称“Employee”

问题是您在类定义的右侧使用了
Employee.employeecount=Employee.employeecount+1
行;这将在程序启动时执行,而不是在创建新员工时执行

此时,
Employee
类将看到
Employee.employeecount
并尝试查找一些已经制作的
Employee
类-它不会意识到您希望它引用自身。在那个时间点,<代码>雇员< /代码>还没有被正确地定义,因为你正处于定义它的中间。另一方面,如果将其放在
\uuuu init\uuuu
函数中,则不会出现问题,因为在实际创建
员工时,该类已被正确定义


此时您要做的只是
employeecount=employeecount+1
。这将消除错误,但这可能不是您想要做的。如果您想在每次创建新员工时添加到计数中,请将该
employee.employeecount=employee.employeecount+1
行与之前一样放入
\uuu init\uuu
函数中。这应该可以解决问题。

您希望更改代码,以便在
init
中增加计数器,以便每次实例化
员工时,计数器都会增加

class Employee(object):
    employeecount = 0 # Start of program this is set to 0

    def __init__(self,name,salary):
        self.name = name
        self.salary = salary
        Employee.employeecount += 1 # Add 1 each time you create an Employee

您不能在
employeecount=0
下面的
employeecount
前面引用
employeecount
,因为您已经处于班级级别

class Employee(object):
    # This is at class level - you don't use "ClassName.variableName"
    # You just use "variableName"
这就是为什么
employeecount=0
不会给您错误,而
Employee.employeecount=Employee.employeecount+1
会给您错误


您的代码在
init
中工作,因为您必须在变量名之前使用类名来访问类变量

def __init__(self,name,salary):
    # This is at the instance level
    # To access a class variable you have to put the class name first

当您将
Employee.employeecount=Employee.employeecount+1
移动到
\uuuu init\uuuuu
中时,您的意思是每次我输入新对象时,都要递增此employeecount变量。创建对象时会调用类的
\uuuuu init\uuuuu
方法,这就是错误消失的原因。

抛出错误的行应该做什么?非常感谢。明白了。谢谢你的快速回复。谢谢你的快速回复。知道了。