Durante o desenvolvimento de um rastreador da web, tentei generalizar o processo tanto quanto possível para lidar com vários tipos de extração de dados de sites.
Percebi que havia muitas classes que tinham uma propriedade na qual era armazenada uma única instância ou uma lista de instâncias da mesma classe como filhos.
Algo assim:
class A:
def __init__(self, a, b, children):
self.a = a
self.b = b
self.children = children # either an instance of A, or a list of elements of type A
@property
def children(self):
return self._children
@children.setter
def children(self, xch):
self._children = xch
Algo como uma árvore, e percebi que precisava usar algo como mapeadores nessas classes.
De tais necessidades surgiu o termo classes divergentes
Quando você precisar aplicar algum procedimento de lógica em um elemento do tipo A e todos os seus filhos e filhos dos filhos … você usará este decorador assim:
@divergent("children")
class A:
def __init__(self, a, b, children):
self.a = a
self.b = b
self.children = children # either an instance of A, or a list of elements of type A
Especificar que a classe é divergente e dar a ela como parâmetro o nome da propriedade divergente, ou como gosto de chamá-la, o ponto de divergência.
O uso será o seguinte:
# Let's suppose that this object has two children, and each of them has one child.
root = A("root's a attribute", "root's b attribute") # I would not explicitly pass in the children for the sake of simplicity.
def _print_a(AInstance):
print("%s" % AInstance.a)
root.diverge(_print_a);
# output
# root's a attribute
# child 1's a attribute
# child 1's child a attribute
# child 2's a attribute
# child 2's child a attribute
O decorador está disponível nesta essência
Você pode ter pensado em usar herança, eu também, mas alguns designs não permitem isso, e este decorador permite a flexibilidade de suportar várias classes com nomenclatura diferente para seu atributo ‘pontos de divergência’, que é o atributo que hospeda os filhos .
Obrigado pela leitura, por favor deixe sua opinião na seção de comentários abaixo, eu adoraria saber o quão útil foi isso. E se você gosta mais, comece a essência.