Python 中的 Self 关键字

2024 年 8 月 29 日 | 阅读 6 分钟

self 代表类实例。我们可以使用 "self" 关键字在 Python 中访问类的属性和方法。该关键字将属性与类提供的参数关联起来。

由于 Python 不使用 @ 语法来创建实例属性的引用,因此我们必须使用 self。Python 选择实现方法,以便类的方法所对应的实例会自动提供,但不会立即接收:任何方法的第一个参数是该方法执行的实例。

探索带有 self 的对象引用

示例 1:self 关键字程序

代码

输出

The reference id of the self method is:  139904481668400
The reference id of the object is:  139904481668400 

为什么每次都要定义 Self 方法?

即使我们理解了 self 的目的,对于学习过其他编程语言的开发者来说,self 每次构造方法时都显式地作为参数提供,这可能会显得很奇怪。有人认为明确总是比隐式更好。

示例 2

我们有一个 Position 类,其中有一个名为 distance 的方法,用于计算给定点到原点的距离。

代码

输出

The distance of the point (3, 4) from the origin is:  5.0

在上述场景中,__init__() 声明了三个参数,但我们只传递了两个(3 和 4)。同样,distance() 接受一个输入,但没有收到任何输入。

示例 3

为什么 Python 解释器没有报告参数数量不匹配?让我们在下面的代码中看看。

代码

输出

The name of the student is Harry
The age of the student is 29
Name of the student is Louis
Age of the student is 30
The age of Harry is  29
The age of Louis is  30 

出现这种情况是因为在函数 Object() 中分配属性后,它们就与该特定对象相关联了;在本例中,当我们初始化对象(Harry 和 Louis)时,属性(name、age)就被附加到对象上。

示例 4

self 参数必须作为第一个参数发送到 Instance 函数和构造函数。如果我们不提供它,将会导致错误。

代码

输出

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
 in 
      7 
      8 # Creating an instance of the class
----> 9 object_ = Paint()
     10 print("This command shows the instance is created")
     11 

TypeError: __init__() takes 0 positional arguments but 1 was given

如何避免 Self 参数?

到目前为止,我们可以看到类对象或实例本身会自动作为第一个参数传递。在创建静态方法时,可以避免这种隐式行为。看下面的简单示例

代码

输出

We did not pass the self parameter to this method

__init__() 不是构造函数

__init__() 函数不是构造函数,这是从信息中得出的一个关键结论。许多初级的 Python 程序员对此感到困惑,因为 __init__() 在我们构建对象时会被执行。

正如我们所知,实例本身是 __init__() 方法的第一个参数。__init__() 方法用于在对象构造完成后立即初始化该对象。

从技术上讲,一个函数 Object() 是一个构建对象本身的方法。这个函数在 Python 中称为 new()。这个方法的语法是

语法

当调用 __new__() 方法时,类本身会自动作为第一个参数(cls)提供。

与 self 一样,cls 也只是一个命名约定。此外,Python 函数调用中使用 *args 和 **kwargs 参数来接受任意数量的参数。

实现 __new__() 时,请记住以下几点

  • __new__() 始终在 __init__() 之前执行。
  • 第一个参数是类名,它是隐式提供的。
  • __new__() 应该始终返回一个合法的对象。这并非必需,但其主要功能是构建并返回一个 Python 对象。

请看以下示例

代码

输出

This is under the new method
The class argument:  <class '__main__.Class'>
The args:  (3, 4)
The kwargs:  {}
This is under the init method

这种情况表明 __new__() 在 __init__() 之前被调用。我们还可以观察到类被作为参数传递给 __new__()(Point)。最后,使用 object 基类的 __new__() 函数创建对象。

在 Python 中,基类,即所有后续类都从中派生的类,是 object。在前面的例子中,我们使用 super() 来实现这一点。

结论

总而言之,Python 中的 self 关键字是在类策略中用于引用实际类的实例的。它允许访问和控制实例的属性和策略。在类内部定义策略时,self 参数通常是包含在内的第一个参数,尽管也可以根据需要将其命名为其他名称。


下一主题Spotify API Python