2010-05-18 15 views
7

¿Sería posible crear una interfaz de clase en python y varias implementaciones de la interfaz?Creación de una interfaz e implementaciones intercambiables en python

Ejemplo: Quiero crear una clase para el acceso pop3 (y todos los métodos, etc.). Si voy con un componente comercial, quiero envolverlo para cumplir con un contrato.

En el futuro, si quiero usar otro componente o código propio, quiero ser capaz de intercambiar cosas y no tener cosas muy juntas.

¿Posible? Soy nuevo en Python.

Respuesta

0

Sí, esto es posible. Normalmente no hay impedimentos para hacerlo: simplemente mantenga una API estable y cambie la forma de implementarla.

2

Por supuesto. No es necesario crear una clase base o una interfaz en este caso, ya que todo es dinámico.

7

Para las personas que provienen de un entorno de lenguaje fuertemente tipado, Python no necesita una interfaz de clase. Puedes simularlo usando una clase base.

class BaseAccess: 
    def open(arg): 
    raise NotImplementedError() 

class Pop3Access(BaseAccess): 
    def open(arg): 
    ... 

class AlternateAccess(BaseAccess): 
    def open(arg): 
    ... 

Pero puede escribir fácilmente el mismo código sin utilizar BaseAccess. El lenguaje fuertemente tipado necesita la interfaz para la verificación de tipos durante el tiempo de compilación. Para Python, esto no es necesario porque todo se busca dinámicamente en tiempo de ejecución. Google 'duck typing' por su filosofía.

Se ha agregado un módulo abstracto de clases base en Python 2.6. Pero no lo he usado.

+0

Gracias msw. No sé si un usuario puede editar la respuesta de otro usuario :) –

+0

Sí, pero solo para las fuerzas del bien. En realidad, fue por capricho porque no pude decir nada que no tuvieras en tu respuesta bien escrita. http://stackoverflow.com/faq (cerca de la parte inferior) – msw

1

Una opción es usar zope interfaces. Sin embargo, como se indicó en Wai Yip Tung, no necesita usar interfaces para lograr los mismos resultados.

El paquete zope.interface es realmente más una herramienta para descubrir cómo interactuar con objetos (generalmente dentro de grandes bases de código con múltiples desarrolladores).

Cuestiones relacionadas