2016-12-28 42 views
-2

我正在尝试学习oop概念,并且选择了python。据我所知,self.count和employee.count都调用类变量计数,它们都应该具有相同的值。但是,下面的代码,我看到self.count是1和employee.count为0python中的self.variable name和classname.variable之间的区别

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

所以他们显然是*不是*相同的变量;那么,你的问题是什么?你有没有尝试制造其他的“雇员”对象? –

+0

No ... self.count和employee.count都指的是前面声明的同一个类变量count – vijay

+0

@vijay但是直到你声明实例变量'self.count' ... – Keiwan

回答

-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) 
+2

请在您的答案中添加一些文字,解释此代码片段如何回答OP的问题 –

+0

Here You go!希望我帮助你们 –

1

这是因为线下的有些微妙:

self.count = self.count + 1 

这里,self.count在左边和self.count在右边是不一样的东西

这行代码创建的名称(即count),其阴影已存在的类的对象(即,employee类)上的相同名称的变量self对象上的一个实例变量(一个employee实例)。

首先评估右侧,并且实际解析类对象上的名称self.count。预先检查实例属性的存在,但由于实例属性未被绑定,因此它不存在。然后,在评估了右侧之后(即,名称self.count得到解决,并且1被添加到它),评估的结果被绑定到实例属性。

两个变量并存:

>>> emp1.count 
1 
>>> emp1.__class__.count 
0 

在这里学习的关键是Python的属性查找过程:实例命名空间被选中,那么类的命名空间被选中

+0

因此,在右手side(self.count + 1),最初查找self.count并且没有找到实例变量。所以,它采用了类变量计数的值(之前已初始化)。找到值(0)后,它将该值递增并将其分配给实例变量。请纠正我,如果我错了 – vijay

+0

这是正确的。 – wim

0

emp1实例的类employee。每个实例都有自己的一组变量,称为实例变量。这些是在班级内部分配的self.var = ...

如果您尝试访问emp1.var和这个实例变量没有分配,Python将附着在类的emp1一个var变量,这意味着它查找employee.var。这些类型的变量称为类变量,它们按照您在课程顶部定义的count=0的方式进行定义。

现在,在您的示例self.count=self.count+1中,左侧分配给实例,因此您要创建一个名为count的实例变量。然而,右侧查找self.count,它尚不存在作为实例变量,因此employee.count实际上被用来代替。如果对实例变量和类变量都不使用相同的变量名称,则可避免这种混淆行为。

相关问题