八月 25

Python中通过类的名称调用属性和通过self调用属性有什么区别

在Python中,当我们要调用类当中的属性时,可以通过两种方式调用:通过类的名称直接调用,或者是通过self来调用,如下图所示:

class student:

    name = "frank"

    def print_name(self):
        print(student.name)

    def print_name2(self):
        print(self.name)

a = student()
a.print_name()
a.print_name2()

输出的结果为:

"frank"
"frank"

此时代码输出的结果是完全一样的。那么这是不是说明在Python中通过类的名称来调用属性和通过self来调用属性是一样的呢?其实在Python中这两种调用方法并不一样。让我们再来看下面的例子:

class student:

    name = "frank"

    def print_name(self):
        print(student.name)

    def print_name2(self):
        print(self.name)

a = student()
a.name = tony
a.print_name()
a.print_name2()

而此时输出的结果为:

"frank"
"tony"

我们来深入理解一下这两种用法的不同之处:

当我们使用类的名称调用某个属性时,我们调用的永远都是类的属性,而不是实例的属性。即使我们稍后创建了一个实例,并在这个实例中修改了这个属性,但是类当中的这个属性还是不变的。这有些类似于其某些语言中的静态属性,这个属性属于类,而不是某个实例。

而当我们使用self调用某个属性时,我们调用的实际上是实例的属性。因此如果我们在实例中修改了某个属性之后在使用self调用的时候,得到的会是我们修改后的值。