Dans certaines piles Whidflow Questions J'ai vu des réponses acceptées lorsque la méthode Ma question est, quels sont les risques de le faire? Le donc, si je devais définir un __ init __ code> de la superclasse Scrapy.Spider est remplacée par l'araignée définie par l'utilisateur. Par exemple: sélénium avec skérapie pour la page dynamique .
__ init __ code> de la super classe ressemble à ceci: p>
__ init __ code> dans mon Spider qui hérite de cette classe et n'incluait pas d'appel à la superclasse
__ init __ code> serait-ce que je serais enfreindre des fonctionnalités de skérapie? Comment atténuer ce risque? Appelez le Super
__ init __ code> dans mon araignée? À la recherche de meilleures pratiques pour la session et aussi une meilleure compréhension de
__ init __ code> appels dans le contexte de l'héritage de classe. P> p>
3 Réponses :
None si vous utilisez Quelque chose d'autre est un risque. Vous copiez le code de la méthode code> méthode de Si vous pouvez implémenter la même logique en gardant un appel à Sinon, à la recherche de nouvelles implémentations, ou à ouvrir une demande de fonctionnalité afin que Scrapy puisse accueillir votre cas d'utilisation de manière sécurisée, constituerait de meilleures solutions à long terme. P> super () .__ init __ (* args, ** kwargs) code>. p>
SPIDER CODE> dans une version Scrapy spécifique, par conséquent, le seul chemin de mise à niveau sécurisé consiste à vérifier comment l'araignée
.__ init __ code> Modification de la mise en œuvre dans les nouvelles versions Scrapy et l'application des modifications à votre implémentation personnalisée lorsque vous mettez à niveau la carrossement. p>
Super () .__ init __ (* args, ** kwargs) code>, ce serait mieux. P>
Ainsi, en utilisant super () .__ init __ (* args, ** kwargs) code> conserve la funcitonalité de la superclasse. Si j'avais aussi besoin de passer des arguments à l'araignée spécifique au
__ init __ code> On ne sait pas pour moi comment Python saura quels arguments vont. Pour m'aider à comprendre pourriez-vous être plus explicite sur la façon dont les deux
__ init __ code> sont des méthodes lorsqu'ils sont tous les deux présents?
Si vous utilisez __ init __ (* args, *, nom = nul, ** kwargs) code> dans votre signature de votre araignée,
nom code> ne sera accepté que comme paramètre mot-clé seulement (en évitant Problèmes dans le scénario improbable que la classe mère introduit de nouveaux arguments de position), et
nom code> ne serait pas inclus dans
kwargs code>, il ne serait donc pas transmis à la classe d'araignée parente lorsque en utilisant
super () .__ init __ (* args, ** kwargs) code>. L'esprit que si
nom code> est également utilisé par la classe d'araignée parente, vous empêcheriez la classe d'araignée parente d'obtenir ce paramètre.
Si vous voyez le dans Python, init est juste une fonction qui est appelée à une initialisation personnalisée et si vous ne le définissez pas, c'est équivalent à faire lt; DR: Vous pouvez le sauter complètement. Assurez-vous simplement que vous définissez Spider .__ init __ code>, il ne prend en charge que
auto.name code> et
self.start_urls code>. Si vous les gérez par vous-même dans les attributs de classe, comme l'exemple de réponse que vous avez mentionné, vous pouvez complètement ignorer la méthode init et cela fonctionnerait toujours bien. P>
def __init __ (auto): passe p>. p>.
super () .__ init __ code> est bon d'avoir pour héritage coopératif dans lequel vous avez plusieurs classes de base. Pour Spider, il est surtout sans rapport, à moins que vous n'écrivez à une tonne d'araignées liées et en réalité besoin d'héritage coopératif. P>
nom code> et
start_urls code> dans vos attributs init ou en classe p>
Je l'obtiens maintenant. Merci.
Afin de préserver la fonctionnalité d'une super classe ' dans la sous-classe Les arguments personnalisés seront géré par votre code personnalisé, puis Un exemple parfait de tout ce genre est le seleniumrequest de Scrapy-selenium A > middleware. P> p> __ init __ code> tout en prolongeant la fonctionnalité de votre sous-classe personnalisée que vous le feriez. P>
__ init __ code> Méthode Vous ajouteriez que vous êtes personnalisé mot-clé arguments puis terminez en passant
* args, ** kwargs code>. Ensuite, appelez explicitement
super () .__ init __ (* args, ** kwargs) code> dans le corps du
__ init __ code>. Comme ceci: p>
* args, ** kwargs code> sera consommé par la super classe '
__ init __ code>. Soyez prudent que vous obteniez l'ordre du
__ init __ code> appels à droite s'ils dépendent l'un de l'autre. P>