我正在尝试学习oop概念,我选择了python。据我所知,self.count和employee.count都调用类变量count,它们都应该具有相同的值。但是,对于以下代码,我看到self.count为1,employee.count为0.
class employee:
count=0
def __init__(self,x):
self.x=x
self.count=self.count+1
print ("this method is executed")
print (self.count)
print (employee.count)
emp1=employee("John")
答案 0 :(得分:1)
由于以下几行,这有点微妙:
self.count = self.count + 1
此处左侧的self.count
和右侧的self.count
不一样!
这行代码在self
对象(employee
实例)上创建一个实例变量,其名称(即count
)会隐藏已存在的同名变量在类对象(即employee
类)上。
首先评估右侧,这实际上解析了类对象上的名称self.count
。实际上实际检查了实例属性的存在,但由于实例属性尚未绑定,因此它尚不存在。然后,在评估右侧(即名称self.count
被解析,并且1
被添加到其中)之后,评估结果被绑定到实例属性。
两个变量共存:
>>> emp1.count
1
>>> emp1.__class__.count
0
这里要学习的关键是Python的属性查找过程:检查实例名称空间,然后检查类名称空间。
答案 1 :(得分:0)
emp1
是类employee
的实例。每个实例都有自己的一组变量,称为实例变量。这些是在类的方法中指定为self.var = ...
的那些。
如果您尝试访问emp1.var
并且未分配此实例变量,则Python会查找附加到var
类的emp1
变量,这意味着它会查找employee.var
。这些变量称为类变量,它们的定义方式与您在类顶部定义count=0
的方式相同。
现在,在您的示例self.count=self.count+1
中,左侧分配给实例,因此您正在创建名为count
的实例变量。但是,右侧会查找self.count
,它不作为实例变量存在,因此实际使用employee.count
。如果不对实例变量和类变量使用相同的变量名,则可以避免这种混淆行为。
答案 2 :(得分:-2)
如果你想要计算创建的Employee
的数量,你必须创建一个方法,它将调用每个对象(不是单独的)。
为此,创建方法并用@staticmethod
装饰她。请注意,此方法在父母身上没有self
。此外,创建变量(这里:count
),它也可以调用每个类对象(之前没有self.
)。
最后将count
变量放在__init__
方法的+= 1
方程式中(与每次创建新Employee
时相比__init__
将+1加入我们的变量)。但请记住在此Employee.
之前添加count
,将每个创建Employee
计为一个群体。
class Employee(object):
count = 0
@staticmethod
def status():
print(Employee.count)
def __init__(self, x):
self.x = x
Employee.count += 1
print("this method is executed")
print("Now, we have got", Employee.count, "Employees")
emp1 = Employee("John")
我们可以用:
显示人口数量print(emp1.count)
emp1.status()
print(Employee.count)