Quelle est la faute de redéfinir une méthode de classe d'un autre module tiers, à Python? P>
En fait, les utilisateurs peuvent créer des matrices numpues contenant numéros avec incertitude ; Idéalement, je voudrais que leur code soit non modifié (comparé au moment où le code manipule des matrices de flotteur); En particulier, ce serait génial si l'inverse de la matrice Comment c'est mauvais pour redéfinir Numpy.Matrix.i? Pour une chose, il aligne le code tiers que je n'aime pas, car il peut ne pas être robuste (que si d'autres modules font la même chose? ...). Un autre problème est que le nouveau numpy.matrix.i est un wrapper qui implique une petite surcharge lorsque l'original numpy.matrix.i peut être appliqué pour obtenir la matrice inverse. P>
est de sous-classement des matrices numpues et ne change que la méthode code> i code> mieux? Cela obligerait les utilisateurs à mettre à jour leur code et à créer des matrices de chiffres avec incertitude avec Tout commentaire ou une approche supplémentaire serait la bienvenue! p> m code> pourrait toujours être obtenu avec
MI code>, malgré le fait que
MI code> doit être calculé Avec mon propre code (la méthode d'origine
i code> ne fonctionne pas, en général). p>
m = matrix_with_uncert (...) code> (au lieu de continuer à utiliser
numpy.matrix (...) code>, comme pour une matrice de flotteurs), mais ceci est peut-être un inconvénient qui devrait être accepté pour le bien de la robustesse? Les inversions matricielles pourraient toujours être effectuées avec
MI code>, ce qui est bon ... D'autre part, ce serait bien que les utilisateurs puissent construire toutes leurs matrices (de flotteurs ou de nombres avec incertitudes) avec
numpy .Matrix () code> directement, sans avoir à la perfectionner de vérifier les types de données. P>
3 Réponses :
En général, il est parfaitement acceptable de remplacer les méthodes qui sont ... p>
Si les deux conditions sont remplies, alors le dépassement devrait être en sécurité. P>
dépend de ce que vous voulez dire avec "redéfinir". Évidemment, vous pouvez utiliser votre propre version de celui-ci, aucun problème du tout. Vous pouvez également redéfinir le sous-classement s'il s'agit d'une méthode.
Vous pouvez également faire une nouvelle méthode et la corriger dans la classe, une pratique appelée monkey_ppatching. Comme: p> Cela fera toutes les instances d'aclass Utilisez votre nouvelle fonction au lieu de l'ancien, y compris des instances dans les modules "de quatrième partie". Cela fonctionne et est très utile, mais il est considéré comme une option très laid et une dernière station. En effet, rien dans le code ACLASS ne suggère que vous avez remplacé la méthode, il est donc difficile de déboguer. Et encore pire, il obtient lorsque deux modules monkeychent la même chose. Ensuite, vous vraiment em> êtes confus. P> p>
Le sous-classement (qui consiste à remplacer, car le terme est généralement utilisé) est généralement très préférable à "patching singe" (des méthodes altérées de la farce dans des classes ou des modules existants), même lorsque ce dernier est disponible (types intégrés, Cela signifie que ceux mis en œuvre dans C, peuvent se protéger contre le correcteur de singe et la plupart d'entre eux le font). P>
Par exemple, si votre fonctionnalité s'appuie sur la correction de singe, elle brisera et arrêtera les mises à niveau si, à tout moment, la classe de la classe de singe est mise à niveau pour être mise en œuvre dans C (pour la vitesse ou spécifiquement pour défendre contre la correction de singe) . Les mainteneurs de paquets tiers hainent le singe-patchs, car cela signifie qu'ils obtiennent de faux rapports de bugs d'utilisateurs hachés qui (à l'insu d'eux) utilisent en fait une buggy singe-patch qui brise le paquet tiers, où ces derniers (à moins que le singe cassé sage) est sans faille. Vous avez déjà fait remarquer sur la performance possible. P>
Conceptuellement, une "matrice de nombres avec incertitude" est un concept différent d'une "matrice de nombres". Le sous-classement exprime ceci proprement, le dosage de singe essaie de le cacher. C'est vraiment la racine de ce qui ne va pas avec la correction de singe en général: un canal secret fonctionnant à travers des moyens globaux et cachés, sans clarté et transparence. Tous les nombreux problèmes pratiques descendent dans un sens de ce problème conceptuel racine. P>
i fortement strong> vous exhortez de rejeter la correction de singe en faveur de solutions propres telles que le sous-classement. P>
Merci pour cette description lucide du patch de singe et de ses problèmes potentiels! Je dois dire que NUMPY encourage la définition de "réseaux de quelque chose" en leur soutenant ( numpy.array ([Any_Object]) code>). Donc, je dirais que "les matrices de tout type d'objet" est un concept très supporté par NUMPY-ELEMENT-SIQUER ADDY est automatiquement supporté, etc., disait, je m'abonne entièrement au reste de votre réponse!