Azúcar sintáctico en Python: método __call__()

Un método de instancia muy especial en una clase de Python es call (). La función de este método es similar a sobrecargar el operador () en una clase, de modo que el objeto de instancia de clase se pueda usar en forma de "nombre de objeto ()" como si llamara a una función normal.

class CLanguage:
    # 定义__call__方法
    def __call__(self,name,add):
        print("调用__call__()方法",name,add)

clangs = CLanguage()
clangs("C语言中文网","http://c.biancheng.net")

El resultado de la ejecución del programa es:

调用__call__()方法 C语言中文网 http://c.biancheng.net

Como puede ver, el objeto de instancia de clangs se convierte en un objeto invocable al implementar el método call () en la clase CLanguage.
En Python, cualquier cosa que pueda aplicarse directamente () a sí mismo y ejecutarlo se denomina objeto invocable. Los objetos a los que se puede llamar incluyen funciones personalizadas, funciones integradas de Python y los objetos de instancia de clase descritos en esta sección.

Para los objetos invocables, "name()" en realidad puede entenderse como una abreviatura de " name.call ()". Aún tomando como ejemplo el objeto de instancia de clangs definido en el programa anterior, la última línea de código también se puede reescribir de la siguiente manera:

clangs.__call__("C语言中文网","http://c.biancheng.net")

Al ejecutar el programa encontrará que los resultados son exactamente los mismos que antes.

Aquí hay otro ejemplo de una función personalizada, por ejemplo:

def say():
    print("Python教程:http://c.biancheng.net/python")
say()
say.__call__()

El resultado de la ejecución del programa es:

Python教程:http://c.biancheng.net/python
Python教程:http://c.biancheng.net/python

No solo eso, el método de instancia en la clase también tiene los dos métodos de llamada anteriores, y no hay ningún ejemplo aquí, y los lectores interesados ​​pueden escribir el código y probarlo por sí mismos.
Use call () para compensar el tablero corto
de la función hasattr() El capítulo anterior presentó el uso de la función hasattr() La función de esta función es averiguar si el objeto de instancia de la clase contiene un atributo o método con el nombre especificado, pero esta función tiene un defecto, es decir, no puede determinar si el nombre especificado es un atributo de clase o un método de clase.

Para resolver este problema, podemos recurrir al concepto de objetos invocables. Debe saber que los métodos contenidos en los objetos de instancia de clase son en realidad objetos a los que se puede llamar, pero los atributos de clase no lo son. por ejemplo:

class CLanguage:
    def __init__ (self):
        self.name = "C语言中文网"
        self.add = "http://c.biancheng.net"
    def say(self):
        print("我正在学Python")
clangs = CLanguage()
if hasattr(clangs,"name"):
    print(hasattr(clangs.name,"__call__"))
print("**********")
if hasattr(clangs,"say"):
    print(hasattr(clangs.say,"__call__"))

El resultado de la ejecución del programa es:

False
**********
True

Como puede ver, dado que el nombre es un atributo de clase, no tiene un método de llamada () llamado llamada ; mientras que decir es un método de clase, que es un objeto invocable, por lo que tiene un método de llamada ().

Supongo que te gusta

Origin blog.csdn.net/weixin_43838785/article/details/123108275
Recomendado
Clasificación