我正在学习 Python 并偶然发现了 OOP 部分。当时我使用 PHP OOP 完成了我的第一步,但同样的事情发生在我身上,我不明白如何在方法中使用self值。
我一直在互联网上阅读,它谈到了自我引用课程等等,但老实说,我不明白这个概念。
例如:
class Persona:
def inicializar(self,nom):
self.nombre=nom
def imprimir(self):
print("Nombre",self.nombre)
persona1=Persona()
persona1.inicializar("Pedro")
persona1.imprimir()
persona2=Persona()
persona2.inicializar("Carla")
persona2.imprimir()
有人能向我解释这是做什么用的self
吗?
在Python中几乎所有东西都是对象,与其他语言不同,类也是对象,这听起来很奇怪,但实际上是这样的:
我们可以看到该类
Prueba
是一个类型的对象,<class 'type'>
而实例化的对象现在是 if, 类型的<class 'Prueba'>
。考虑到这一点,为什么使用self
. 假设与您的示例类似:我们已经使用
Persona
类型<class 'type'>
(类)的对象来创建两个新的对象<class 'Persona'>
。访问方法的正常方法是这样做:但实际上在下面发生的事情,也就是Python实际在做的事情,是这样的:
一种看待这一点的方式是,每个实例
p1
都没有p2
方法的“副本”imprimir
,这没有意义,方法属于类Persona
,数据self.nombre
确实属于每个实例。因此,为了Persona
能够imprimir
使用正确的实例数据调用它,您需要将方法声明为imprimir(<instancia>)
.澄清:
self
这是我们可以使用任何名称的约定,但不建议这样做。完成并考虑到。使用
self
是 Python 中的约定,是一种很好的做法,但不是规则(它不是保留字或类似的东西)。我的意思是您可以使用任何名称来表示类实例:
对于 Python,这是一个完全正常的类。在课堂上
A
,我已将. 注意,这只是一个澄清。self
instancia
您可能还会遇到一些缺少的方法,
self
例如在使用静态方法时:在 PEP 8 的函数和方法参数(Python 代码的样式指南)
self
中指定了将 用作方法的第一个参数。参数
self
指的是调用所述方法的那个类的实例化对象。也就是说,您用来调用该方法的对象(在您的示例persona1
和中persona2
)。Python 在类的已定义方法中确定方法中定义的第一个参数将接收调用该方法的对象。
self
该参数(尽管可以使用任何变量名 [参见注释] ,但通常被调用)在方法实现中用于根据需要修改所述对象的内容或属性。因此,一个类的所有可以通过一个对象调用的方法都至少有一个参数是一个必要条件,该参数将自动分配给调用时使用的对象。
虽然在方法的定义中,
self
它是第一个参数,但在调用该方法时,不需要显式地将对象本身作为第一个参数传递,因为 Python 会隐含地执行此操作,而无需手动执行。也就是说,self
方法的第一个参数自动分配给对象本身,其余参数分配给您调用该方法的参数。在方法的情况下
__init__()
,参数self
是指在创建所述对象时要获取的类的新实例化对象Nombre_Clase()
。self
this
是其他语言的等价物(虽然self
不是this
[见注释]之类的保留字),不同的是在其他语言中不需要定义带参数的方法this
,而在Python中是必须的.正如您所说,它是一个自我引用,一般来说,在模型实例方法中,您应该在修改属性或调用局部变量和已定义的属性/方法之间存在歧义时使用 self。这发生在所有使用 OOP 的语言中,这是一种非常普遍且最正确的做法,因此我建议您使用它。