Los métodos en Python son como funciones, excepto que están adjuntos a un objeto. Los métodos se llaman en objetos y posiblemente realicen cambios en ese objeto. Estos métodos pueden ser un método Bound, Unbound o Static. Los métodos estáticos son uno de los tipos de método Unbound. Estos tipos se explican en detalle a continuación.
Métodos enlazados
Si una función es un atributo de clase y se accede a ella a través de las instancias, se denominan métodos vinculados. Un método enlazado es aquel que tiene ‘ self
‘ como primer argumento. Dado que estos dependen de la instancia de las clases, también se conocen como métodos de instancia.
Necesidad de estos métodos enlazados
Los métodos dentro de las clases tomarían al menos un argumento. Para convertirlos en métodos de argumento cero, decorators
se debe usar ‘ ‘. Diferentes instancias de una clase tienen diferentes valores asociados con ellas.
Por ejemplo, si hay una clase «Frutas», son posibles instancias como manzana, naranja, mango. Cada instancia puede tener diferente tamaño, color, sabor y nutrientes. Por lo tanto, para alterar cualquier valor para una instancia específica, el método debe tener ‘self’ como argumento que le permita alterar solo su propiedad.
Ejemplo:
class sample(object): # Static variable for object number objectNo = 0 def __init__(self, name1): # variable to hold name self.name = name1 # Increment static variable for each object sample.objectNo = sample.objectNo + 1 # each object's unique number that can be # considered as ID self.objNumber = sample.objectNo def myFunc(self): print("My name is ", self.name, "from object ", self.objNumber) def alterIt(self, newName): self.name = newName def myFunc2(): print("I am not a bound method !!!") # creating first instance of class sample samp1 = sample("A") samp1.myFunc() # unhide the line below to see the error # samp1.myFunc2() #----------> error line # creating second instance of class sample samp2 = sample("B") samp2.myFunc() samp2.alterIt("C") samp2.myFunc() samp1.myFunc()
Producción:
My name is A from object 1 My name is B from object 2 My name is C from object 2 My name is A from object 1
En el ejemplo anterior, se crean dos instancias, a saber, samp1 y samp2. Tenga en cuenta que cuando la función alterIt()
se aplica a la segunda instancia, solo se cambia el valor de esa instancia en particular. La línea samp1.myFunc() se expandirá como sample.myFunc(samp1) . Para este método no es necesario pasar ningún argumento explícito. La instancia samp1 se pasará como argumento a myFunc(). La línea samp1.myFunc2() generará el error:
Traceback (most recent call last): File "/home/4f130d34a1a72402e0d26bab554c2cf6.py", line 26, in samp1.myFunc2() #----------> error line TypeError: myFunc2() takes 0 positional arguments but 1 was given
Significa que este método no está vinculado . No acepta ninguna instancia como argumento. Estas funciones son funciones independientes.
Métodos no enlazados y métodos estáticos
Los métodos que no tienen una instancia de la clase como primer argumento se conocen como métodos independientes. A partir de Python 3.0, los métodos independientes se eliminaron del lenguaje. No están acotados con ningún objeto específico de la clase. Para que el método myFunc2() funcione en la clase anterior, debe convertirse en un método estático
Los métodos estáticos son similares a los métodos de clase, pero están completamente ligados a la clase en lugar de a objetos particulares. Se accede a ellos usando nombres de clase.
Necesidad de hacer un método estático
No todos los métodos necesitan alterar las instancias de una clase. Podrían servir para cualquier propósito común. Un método también puede ser una función de utilidad.
Por ejemplo, cuando necesitamos usar ciertas funciones matemáticas, usamos la clase integrada Math
. Los métodos de esta clase se hacen estáticos porque no tienen nada que ver con objetos específicos. Hacen acciones comunes. Por lo tanto, cada vez que no es una forma optimizada de escribir como:
math=Math() math.ceil(5.23)
Por lo tanto, se puede acceder a ellos simplemente usando su nombre de clase como Math.ceil(5.23)
.
Un método se puede hacer estático de dos maneras:
- Usando el método estático()
- Usando decorador
Usando staticmethod(): La staticmethod()
función toma la función a convertir como su argumento y devuelve la versión estática de esa función. Una función estática no sabe nada sobre la clase, solo funciona con los parámetros que se le pasan.
Ejemplo:
class sample(): def myFunc2(x): print("I am", x, "from the static method") sample.myFunc2 = staticmethod(sample.myFunc2) sample.myFunc2("A")
Producción:
I am A from the static method
Usar decoradores: estas son características de Python que se usan para modificar una parte del programa usando otra parte del programa en el momento de la compilación. El decorador que se puede usar para hacer que un método sea estático es
@staticmethod
Esto informa a la metaclase predeterminada incorporada que no cree ningún método vinculado para este método. Una vez que esta línea se agrega antes de una función, la función se puede llamar usando el nombre de la clase. Considere el ejemplo tomado para el método Bound donde encontramos un error. Para superar eso, se puede escribir como:
class sample(object): # Static variable for object number objectNo = 0 def __init__(self, name1): # variable to hold name self.name = name1 # Increment static variable for each object sample.objectNo = sample.objectNo + 1 # each object's unique number that can be # considered as ID self.objNumber = sample.objectNo def myFunc(self): print("My name is ", self.name, "from object ", self.objNumber) def alterIt(self, newName): self.name = newName # using decorator to make the method static @staticmethod def myFunc2(): print("I am not a bound method !!!") # creating first instance of class sample samp1 = sample("A") samp1.myFunc() sample.myFunc2() #----------> error line # creating second instance of class sample samp2 = sample("B") samp2.myFunc() samp2.alterIt("C") samp2.myFunc() samp1.myFunc()
Producción:
My name is A from object 1 I am not a bound method !!! My name is B from object 2 My name is C from object 2 My name is A from object 1
Aquí, la línea sample.myFunc2() se ejecuta sin ningún error y el print() dentro de ella funciona perfectamente y da la salida ¡No soy un método enlazado!
Publicación traducida automáticamente
Artículo escrito por erakshaya485 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA