Método de llamada de Python sin ‘auto’

4 minutos de lectura

Entonces comencé a programar en python y no entiendo todo el razonamiento detrás de ‘yo’. Entiendo que se usa casi como una variable global, por lo que se pueden pasar datos entre diferentes métodos en la clase. No entiendo por qué necesita usarlo cuando llama a otro método en la misma clase. Si ya estoy en esa clase, ¿por qué tengo que contarlo?

ejemplo, si tengo: ¿Por qué necesito self.thing()?

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

  • Abra un intérprete de Python y ejecute import this para obtener una explicación de la mayoría de las decisiones de lenguaje de Python.

    – Colin Valliant

    8 de septiembre de 2013 a las 2:33

  • @ColinValliant: Declaraciones doctrinales oscuras y versátiles como “Ahora es mejor que nunca. Aunque nunca suele ser mejor que *correcto now.*” solo puede ser interpretado por una pitonisa iluminada y realmente no ayuda a responder la pregunta.

    – minutos

    3 de agosto de 2017 a las 11:59

También puedes hacer métodos en clase. static así que no hay necesidad de self. Sin embargo, use esto si realmente lo necesita.

Tuyo:

class bla:
    def hello(self):
        self.thing()

    def thing(self):
        print "hello"

edición estática:

class bla:
    @staticmethod
    def hello():
        bla.thing()

    @staticmethod
    def thing():
        print "hello"

  • Sé que esta es una publicación anterior, pero ¿le importaría dar un ejemplo de un escenario en el que se usaría un método estático?

    – uitty400

    19 de agosto de 2016 a las 11:57

  • @uitty400 Los métodos estáticos operan en una o más variables estáticas. Por ejemplo, tiene una variable estática que lleva la cuenta del número de instancias creadas hasta el momento. Entonces se podría usar un método estático para, por ejemplo, incrementar ese contador.

    – John Strod

    16 de agosto de 2018 a las 8:19

  • @ uitty400 los métodos no estáticos pueden acceder a variables estáticas, pero los métodos estáticos no pueden acceder a variables no estáticas.

    – John Strod

    16 de agosto de 2018 a las 8:20

  • @Developer, no necesita el argumento propio en thing definición. Esto es soporte para no usar @staticmethod en absoluto y simplemente refiriéndose a los métodos por el prefijo del nombre de la clase

    – matsuo_basho

    22 de agosto de 2021 a las 16:05


  • Incluso si no uso self funciona sin usar el @staticmethod decorador.

    – Volátil3

    6 de septiembre de 2022 a las 5:53

Avatar de usuario de Bleeding Fingers
dedos sangrantes

Una razón es referirse al método de ese particular instancia de la clase dentro de la cual se ejecutará el código.

Este ejemplo podría ayudar:

def hello():
    print "global hello"

class bla:
    def hello(self):
        self.thing()
        hello()

    def thing(self):
        print "hello"

b = bla()
b.hello()
>>> hello
global hello

Puede considerarlo, por ahora, como una resolución de espacio de nombres.

Probé debajo del código que declaró el método sin parámetro en la clase y llamé al método usando el nombre de la clase.

class Employee:

    def EmpWithOutPar():
        return 'Hi you called Employee'

print(Employee.EmpWithOutPar())

salida: hola llamaste empleado

La respuesta corta es “porque puedes def thing(args) como una función global, o como un método de otra clase. Toma este (horrible) ejemplo:

def thing(args):
    print "Please don't do this."

class foo:
    def thing(self,args):
        print "No, really. Don't ever do this."

class bar:
    def thing(self,args):
        print "This is completely unrelated."

Esto es malo. No hagas esto. pero si tu hizopodrías llamar thing(args) y algo podría pasar. Potencialmente, esto puede ser algo bueno si planifica en consecuencia:

class Person:
    def bio(self):
        print "I'm a person!"

class Student(Person):
    def bio(self):
        Person.bio(self)
        print "I'm studying %s" % self.major

El código anterior hace que si creas un objeto de Student clase y llamada biohará todas las cosas que habrían pasado si fuera de Person clase que tenía su propia bio llamó y después hará lo suyo.

Esto entra en la herencia y algunas otras cosas que quizás no hayas visto todavía, pero espera con ansias.

Para mí, self como un definidor de ámbito, con self.foo() y self.bar indicando la función y el parámetro definido en la clase y no los definidos en los otros lugares.

Avatar de usuario de D4NI3LS
D4NI3LS

Puede haber otra función con el mismo nombre fuera de su clase.
self es una referencia de objeto al objeto mismo, por lo tanto, son iguales. Los métodos de Python no se llaman en el contexto del objeto en sí. self en Python se puede usar para tratar con modelos de objetos personalizados o algo así.

¿Ha sido útil esta solución?