为什么在Python类的构造函数中的变量通常前面都要加上“self.“?

阅读本篇博文前建议先看下我的另一篇博文:
Python面向对象编程(类编程)中self的含义详解(简单明了直击本质的解释)

回到本文中的问题:
为什么在Python类的构造函数中的变量通常前面都要加上"self."?

在 Python 类中,self 是一个约定俗成的名称,用于表示类的实例本身。在类的方法中,包括构造函数 __init__,使用 self 可以引用当前类的实例,并通过 self 来访问和操作实例的属性。

在构造函数中,通过使用 self 前缀,将变量赋值给 self 对象的属性,可以确保这些变量在类的其他方法中都能被访问到。这样做有助于区分局部变量和实例变量,并提供对实例属性的一致性访问。

下面是一个示例代码,演示了在 Python 类的构造函数中使用 self 前缀来定义实例变量:

class MyClass:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2
        
    def method1(self):
        print("Method 1")
        print("var1:", self.var1)
        print("var2:", self.var2)

在上述示例中,var1var2 是构造函数的参数。通过使用 self.var1 = var1self.var2 = var2,我们将参数值赋值给了类的实例变量 var1var2

然后,在类的其他方法中,例如 method1,我们可以通过 self.var1self.var2 来访问这些实例变量,以及在方法内部对其进行操作。

请注意,使用 self 前缀只适用于类的实例变量。在类的方法中,如果需要定义仅在方法内部使用的局部变量,则无需使用 self 前缀。

提问:
如果把上面代码中构造函数中的:

self.var1 = var1
self.var2 = var2

写成是:

var1 = var1
var2 = var2

那么是不是在方法method1()中就没有办法使用变量var1和var2了。

回答:
是的,如果在构造函数中将变量赋值给 var1var2,而不是使用 self.var1self.var2,那么这些变量将成为构造函数的局部变量,并且在类的其他方法中将无法访问这些变量。

在 Python 类中,如果在方法中声明一个变量而没有使用 self 前缀,那么这个变量就是一个局部变量,它只在该方法的作用域内可见。这意味着其他方法无法访问和使用这些局部变量。

下面是一个示例,演示了在构造函数中将变量赋值给 var1var2,而在方法 method1 中无法访问这些局部变量的情况:

class MyClass:
    def __init__(self, var1, var2):
        var1 = var1
        var2 = var2
        
    def method1(self):
        print("Method 1")
        print("var1:", var1)  # 无法访问局部变量 var1
        print("var2:", var2)  # 无法访问局部变量 var2

在上述示例中,构造函数中的 var1 = var1var2 = var2 只是在构造函数内部创建了局部变量,并没有将它们赋值给类的实例属性。因此,在 method1 方法中,无法访问这些局部变量,会导致 NameError 错误。

要使这些变量成为实例属性,并在类的其他方法中可见和可访问,应该使用 self.var1 = var1self.var2 = var2,以将它们赋值给类的实例属性。

class MyClass:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.var2 = var2
        
    def method1(self):
        print("Method 1")
        print("var1:", self.var1)  # 可以访问实例属性 var1
        print("var2:", self.var2)  # 可以访问实例属性 var2

在上述示例中,使用 self.var1 = var1self.var2 = var2 将变量赋值给了类的实例属性,使得它们在类的其他方法中可见和可访问。

总结:本文的内容其实可以结合函数中的全局全量和局部变量的概念来理解。

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/131399283
今日推荐