Açúcar sintático em Python: método __call__()

Um método de instância muito especial em uma classe Python é call (). A função desse método é semelhante a sobrecarregar o operador () em uma classe, para que o objeto de instância de classe possa ser usado na forma de "nome do objeto ()" da mesma forma que chamar uma função normal.

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

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

O resultado da execução do programa é:

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

Como você pode ver, o objeto de instância clangs se torna um objeto que pode ser chamado pela implementação do método call () na classe CLanguage.
Em Python, qualquer coisa que possa aplicar () diretamente a si mesmo e executá-lo é chamado de objeto que pode ser chamado. Os objetos que podem ser chamados incluem funções personalizadas, funções internas do Python e os objetos de instância de classe descritos nesta seção.

Para objetos que podem ser chamados, "name()" pode ser entendido como um atalho para " name.call ()". Ainda tomando como exemplo o objeto de instância clangs definido no programa acima, a última linha de código também pode ser reescrita da seguinte forma:

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

A execução do programa descobrirá que os resultados são exatamente os mesmos de antes.

Aqui está outro exemplo de uma função personalizada, por exemplo:

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

O resultado da execução do programa é:

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

Além disso, o método de instância na classe também tem os dois métodos de chamada acima, e não há exemplo aqui, e os leitores interessados ​​podem escrever o código e experimentá-lo por conta própria.
Use call () para compensar a prancheta
da função hasattr() O capítulo anterior introduziu o uso da função hasattr() A função desta função é descobrir se o objeto instância da classe contém um atributo ou método com o nome especificado, mas esta função tem um defeito, ou seja, não pode determinar se o nome especificado é um atributo de classe ou um método de classe.

Para resolver este problema, podemos recorrer ao conceito de objetos chamáveis. Você deve saber que os métodos contidos em objetos de instância de classe são, na verdade, objetos que podem ser chamados, mas os atributos de classe não são. por exemplo:

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__"))

O resultado da execução do programa é:

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

Como você pode ver, como name é um atributo de classe, ele não possui um método call () chamado call ; enquanto say é um método de classe, que é um objeto que pode ser chamado, então ele possui um método call () .

Acho que você gosta

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