Eu tenho uma classe de interface chamada iResource, bem como várias subclasses que implementam a função “request”. Como as rotinas de solicitação empregam E/S de soquete para outros computadores, elas devem ser executadas de forma assíncrona para que as outras máquinas possam trabalhar em paralelo.
Quando inicio um thread com iResource.request e passo uma subclasse como primeiro parâmetro, ele chama a função de superclasse. Se eu começar com “type(a).request” e “a” como o primeiro parâmetro, obtenho “” para o valor do tipo (a). Alguma ideia do que isso implica e como determinar o tipo real do método? É possível declarar explicitamente um método abstrato em Python?
def getSocialResults(self, query=''):
#for a in self.types["social"]: print type(a)
tasks = [type(a).request for a in self.types["social"]]
argss = [(a, query, 0) for a in self.types["social"]]
grabbers = executeChainResults(tasks, argss)
return igrabber.cycleGrabber(grabbers)
“executeChainResults” espera uma lista de callables “tasks” e args-tuples “argss” para produzir uma lista. Em seguida, ele executa cada um em um thread diferente e concatena as listas de resultados. Posso fornecer esse código, se necessário, mas não tive problemas com ele, por isso vou mantê-lo fora por enquanto.
Por ter um único construtor que apenas gera um erro, os objetos “a” DEFINITIVAMENTE NÃO são do tipo iResource conforme mencionado nessa fonte. No entanto, substituir “type(a).request” por “iResource.request” chama a função de classe base. Além disso, acessar explicitamente “self.types[“social”][0].request” funciona bem, porém o código anterior retorna: “type object ‘instance’ has no attribute’request’”.
Descomentar a linha comentada repetidamente imprime o tipo ‘instância’>.