2011-04-05 3 views
4

J'ai une classe qui attend un flux contenant un fichier XML.
Je ne veux pas nécessairement un flux de fichier et je pourrais utiliser d'autres sources comme une base de données, une socket, etc.
De quelle classe ai-je besoin pour sous-classer le io module afin de fournir l'interface de flux d'autres sources?Création d'une classe de flux en Python

+1

Une socket a déjà la même interface qu'un autre Une connexion à une base de données fournit généralement un "blob" qui peut être transformé en objet de ligne de fichier en utilisant 'StringIO'. Pourquoi sous-classez-vous quelque chose quand votre interface "stream" (c'est-à-dire, 'file' de Python) existe déjà? Qu'est-ce qui est unique ou différent? –

+0

Pourquoi dériver? Python n'est pas C++. Etes-vous sûr que passer juste quelque chose qui a une bonne méthode 'read()' n'est pas suffisant? – 6502

+0

@ 6502: Le fichier XML peut être chargé à partir d'une base de données dans un flux. Je suis juste en train d'encapsuler un comportement. –

Répondre

4

Le typage dynamique vous permet de ne sous-classer aucune classe de base dans ce cas. Vous devez implémenter certaines méthodes avec des noms propres. Blog post on the subject

+0

Ce que je ne comprends pas est pourquoi je ne devrais pas sous classe. En tout cas, mon interface devrait être l'interface du flux. –

+0

J'ai écrit seulement que vous êtes capable de ne pas sous-classer en utilisant le mécanisme d'héritage et pouvez créer votre classe et implémenter des méthodes avec la signature nécessaire est nécessaire et suffisante – Andrey

0

La réponse donnée par Andrey n'est pas entièrement correcte.

En Python, les flux sont des objets de type "fichier". Vous pouvez les lire/écrire en utilisant les outils définis dans le module io. Le module fournit également des interfaces que vous devez implémenter si vous voulez définir un objet stream.

Notez que le module io différencie trois types de flux différents, qui nécessitent des interfaces légèrement différentes. (Ils diffèrent principalement en termes de types de données.)

  1. texte E/S - Interface TextIOBase
  2. E/S binaire - Interface BufferedIOBase
  3. I/O Raw - Interface RawIOBase

StringIO par exemple est une implémentation en mémoire de la TextIOBase. Notez que ces interfaces sont disponibles sur Python 2 et 3.