8
votes

Python a-t-il des interfaces de style C # / Java?

J'ai travaillé pendant quelques mois en tant que programmeur C # et est habitué à l'idée de Generics / Modèles Interfaces, que je pourrais transmettre à une bibliothèque sans attirer la création de l'objet.

Je suis sur le point de commencer un projet relativement important, probablement en Python (j'ai déjà écrit beaucoup de python, mais surtout mon propre code pour analyse de données, etc.), et je me demandais s'il existe un concept similaire dans cette langue? J'ai essayé de googler et ne pas venir beaucoup.

Si la réponse n'est pas, ça va, mais dans ce cas, que font généralement les gens?


6 commentaires

Je ne suis pas sûr de ce que c'est exactement que vous recherchez. Les modèles et les génériques sont des choses complètement différentes (faites-vous des modèles T4?) Pouvez-vous donner des échantillons C # de ce que vous aimeriez faire à Python?


Je dirais que les modèles OP signifie C ++, l'inspiration originale des génériques Java / C #


Les modèles C ++ sont bien plus que des génériques cependant, ce qui invalide les réponses ci-dessous doit parler de modèles C ++. Je ne pense pas que, car seul c # est mentionné et que le phrasé "modèles / génériques" suggère que OP n'est pas vraiment conscient de la différence.


Bonjour à tous, merci pour des commentaires. Je viens de rentrer de mon déjeuner et maintenant mon cerveau me dit que j'aurais dû dire des interfaces, non des génériques ou des modèles. Est ce que ça aide?


Interfaces? Nous n'avons pas d'interfaces. Nous n'avons pas besoin d'interfaces! Nous n'avons pas besoin d'interfaces puantes !!


Bien que le point hors point, je pense que la question est que vous aviez besoin de laisser aller de votre pensée de type statique et d'embrasser la pensée de type dynamique. Python est oop est c # mais a des bizarreries différentes ...


5 Réponses :


5
votes

Python est dactylographié dynamiquement (dans la plupart des cas), il n'y a pas besoin de génériques / de modèles.


0 commentaires

17
votes

Si la réponse n'est pas, ça va, mais dans ce cas, que font généralement les gens?

dactylographie de canard .

Ce qui est important, c'est d'aborder Python en laissant tomber les bagages techniques de c #.

Apprenez Python en tant que nouvelle langue . N'essayez pas de cartographier des concepts entre Python et C #. De cette façon se trouve la folie.


"interfaces, non génériques, ni modèles"

Peu importe. Toute cette technologie de déclaration de type statique n'est pas nécessaire. Pour cette affaire de type casting afin de casser les règles n'est pas nécessaire non plus.


0 commentaires

5
votes

Ma compréhension des interfaces est de Java, j'espère donc que c'est assez proche de ce que vous voulez dire ...

Il n'y a pas de moyen syntaxique d'affirmer qu'un objet particulier a un ensemble de méthodes et de champs, car Python utilise Typothing dynamique / dactylographie de canard . Si vous souhaitez vérifier si un objet a une certaine méthode ou champ, vous pouvez:

  • creuser dans la réflexion (c'est le plus de travail)
  • Vérifiez ce que vous voulez dans son __ dict __ (un dictionnaire de tout un membres de l'objet). myobj .__ dict __. Haskey (o) est ce que vous voulez, je pense. (assez facile)
  • Utilisez simplement l'objet et faites confiance que vous, vos collègues développeurs ou vos utilisateurs vous ont donné un objet approprié. (Maximum facile, mais dangereux)
  • ou, faites-le ci-dessus et enveloppez-le dans un blocage / sauf bloc. (Ceci sera familier aux programmeurs Java)

    Conception d'un ensemble complexe de classes dans Python est une expérience très différente de faire la même chose dans des langages de type C, alors soyez prêts à faire des choses que vous pourriez être mal à l'aise avec (comme l'option 3, ci-dessus). Bonne chance!


2 commentaires

Merci - je savais que l'option 3 était disponible pour moi, mais si je peux convaincre mes autres membres de l'équipe de ne pas l'utiliser, je vais essayer :) Le reste est également utile. Merci!


Probablement une bonne idée, oui. Je le fais beaucoup dans mes affaires personnelles, mais personne ne mourra ni ne perde de l'argent si je le fais mal.



3
votes

zope.interface

Mais la plupart des gens ne l'utilisent pas.


0 commentaires

4
votes

Si vous parlez strictement à propos de l'interface C # / Java, alors la réponse est simple. Ce sont des concepts qui appartiennent à des langues typées statiquement et ne s'appliquent pas vraiment à une langue dynamique telle que Python.

L'approche pythonique habituelle est de faire confiance aux objets que vous obtenez et de supposer qu'ils ont les traits nécessaires dont vous avez besoin. Si elles ne le font pas, vous pourriez vous attendre à des erreurs d'exécution pouvant être manipulées ou laissées pour l'appelant. Cela corresponde à la nature dynamique générale de la langue: si quelque chose ne va pas, vous pouvez vous attendre à ce que la surface de l'exécution.

interfaces de Java ou C #, d'autre part, sont des moyens pour vérifier les conditions préalables nécessaires (c.-à-d. Objets ayant certaines méthodes) pendant compilation . Cela (sans doute) transmet une partie de la flexibilité d'exécution pour une sécurité accrue des contrôles de temps de compilation.

Notez que cela ne signifie pas que tout concept langage dactylographié dynamiquement. En fait, Python a une notion légèrement floue de "méta-types" - tels que itérables - qui sont souvent vérifiées contre, par ex. En vérifiant la présence de méthode (s) particulière (s): xxx

Ceci est conceptuellement similaire aux interfaces non manifestes de GO Language. Si vous souhaitez avoir votre propre appareil, vous venez d'implémenter la méthode __ iter __ - sans indiquer explicitement que vous sera le mettre en œuvre (comme dans Java, où vous hériteriez de Liste classe). Si quelqu'un veut vérifier si votre objet est en effet un iérien, ils peuvent vérifier si le "contrat" ​​- c'est-à-dire avoir __ iTer __ méthode - est effectivement rempli. C'est ce que Andronikus a décrit dans leur réponse.

comme bouchon sans scrupule, je peux signaler au Pyduck Bibliothèque que je suis implémentée. Il vise à simplifier (et peut-être même) de vérification de tels «contrats» (via une réflexion) et de la rendre légèrement plus fiable.


0 commentaires