Auto uso de Python

que es el yo

Se estipula en la clase Python que en el proceso de definición de la clase, ya sea para crear explícitamente el método de construcción de la clase o agregar un método de instancia a la clase, se requiere el parámetro self como primer parámetro del método, que representa el objeto de la clase actual. Puede llamar a las propiedades y métodos de la clase actual.
self representa una instancia de la clase, no la clase en sí

class Test():
    def testfunc(self):
        print(self)
        print(self.__class__)
t=Test()
t.testfunc()

La salida es:

<__main__.Test object at 0x000002DF2860BD88>
<class '__main__.Test'>

¿No se puede escribir el yo en el método de la clase?

No, dentro del intérprete de Python, cuando llamamos a t.testfunc (), Python en realidad lo interpreta como Test.testfunc (t), lo que significa que self se reemplaza con una instancia de la clase.

class Test():
    def testfunc():
        print(self)
        print(self.__class__)
t=Test()
t.testfunc()

Error:

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

A excepción de los métodos de clase,
es decir, no se pasa ninguna instancia al definir y llamar

class Test():
    def testfunc():
        print(__class__)
        
Test.testfunc()#<class '__main__.Test'>

En la herencia, qué instancia se pasa, self se refiere a la instancia pasada, no a la instancia de la clase donde se define self, es decir: self siempre se refiere a la instancia de la clase en el momento de la llamada.

class Test1():
    def testfunc1(self):
        print(self)
class Test2(Test1):
    def testfunc2(self):
        print(self)

cc=Test2()
cc.testfunc2()
cc.testfunc1()
tt=Test1()
tt.testfunc1()

Cuando se ejecuta cc.testfunc2 (), se refiere a una instancia de la clase Test2.
Cuando se ejecuta cc.testfunc1 (), es equivalente a Test2.testfunc1 (cc), por lo que self todavía se refiere a una instancia de la clase Test2. Dado que no hay ningún método testfunc1 () definido en self, buscamos el árbol de herencia y encuentra que está en el padre El método testfunc1 () está definido en la clase Test1, por lo que se llamará correctamente.
Entonces la salida es:

<__main__.Test2 object at 0x0000020210152BC8>
<__main__.Test2 object at 0x0000020210152BC8>
<__main__.Test1 object at 0x0000020210152C48>

¿Cuál es el papel específico del parámetro self?

Por ejemplo, si compara una analogía con un plano para construir una casa, entonces el objeto después de que se crea una instancia de la clase es una casa real en la que se puede vivir. De acuerdo con un dibujo (clase), podemos diseñar miles de casas (objetos de clase), cada una de las cuales se ve similar (todas tienen las mismas variables de clase y métodos de clase), pero todas tienen sus propios dueños, entonces, ¿cómo distinguirlas? ?
Por supuesto, a través del parámetro self, es equivalente a la llave de la puerta de cada casa, lo que puede garantizar que el propietario de cada casa solo pueda ingresar a su propia casa ( cada objeto de clase solo puede llamar a sus propias variables de clase y métodos de clase ).
En otras palabras, la misma clase puede producir varios objetos. Cuando un objeto llama a un método de clase, el objeto pasará automáticamente su propia referencia como primer parámetro al método. En otras palabras, Python vinculará automáticamente la clase El primer parámetro de el método apunta al objeto que llamó al método. De esta forma, el intérprete de Python puede saber qué método de objeto manipular.
Por lo tanto, el programa no necesita pasar manualmente el valor del primer parámetro al llamar a métodos de instancia y métodos de construcción.
Llame a las variables miembro de la clase a través de self:

class Test():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def testfunc1(self):
        print("I'm",self.name,",",self.age,"years old")

te1=Test("Tom",19)
te1.testfunc1()#I'm Tom , 19 years old
te2=Test("lili",17)
te2.testfunc1()#I'm lili , 17 years old

Cuando se inicializa te1, self en el constructor llamado representa "Tom 19"; y cuando se inicializa te2, self en el constructor llamado representa "lili 17"

Llame al método de la clase por sí mismo:

class Test():
    def __init__(self,number1,number2):
        self.number1=number1
        self.number2=number2
    def add(self):
        return self.number2+self.number1
    def multip(self):
        return self.number2 * self.number1
    def show(self):
        print("Result Add",self.add())
        print("Result Mul:",self.multip())

te=Test(12,5)
te.show()
#Result Add 17
#Result Mul: 60

1. El primer parámetro del método init es siempre self, lo que significa la instancia creada en sí. Por lo tanto, dentro del método init , varias propiedades pueden vincularse a self, porque self apunta a la instancia creada en sí.
2. Utilizado El método init , al crear una instancia, no puede pasar parámetros vacíos, debe pasar los parámetros que coinciden con el método init , pero no es necesario pasar self, el intérprete de Python pasará las variables de instancia por sí mismo

Supongo que te gusta

Origin blog.csdn.net/liulanba/article/details/114306890
Recomendado
Clasificación