python中self.variable name和classname.variable之间的区别

时间:2016-12-28 20:57:07

标签: python oop

我正在尝试学习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")       

3 个答案:

答案 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)