Je souhaite créer une Abstract Factory afin d'abstraire les différences matérielles entre les ordinateurs (disons un RaspberryPi et un Arduino) dans Python 2.7.
J'utilise l'implémentation suivante d'une usine abstraite :
'''
Provide a device-agnostic display interface
'''
from hardware import sysname
class DisplayBase(object):
def __init__(self):
pass
def show(self, message):
pass
def __str__(self):
return "DisplayBase"
def __repr__(self):
return self.__str__()
class RPIDisplay(DisplayBase):
def __new__(cls, *args, **kwargs):
from rpi_display import writeline
instance = super(RPIDisplay, cls).__new__(cls, *args, **kwargs)
return instance
def __str__(self):
return "RPIDisplay"
def show(self, message):
writeline(message)
class ArduinoDisplay(DisplayBase):
def __new__(cls, *args, **kwargs):
import arduino_display
instance = super(ArduinoDisplay, cls).__new__(cls, *args, **kwargs)
return instance
def __str__(self):
return "ArduinoDisplay"
def show(self, message):
return arduino_display.println(message)
class Display(DisplayBase): # Display Factory
def __new__(cls, *args, **kwargs):
platform = sysname()
if platform == "RaspberryPi":
return RPIDisplay()
elif platform == "Arduino":
return ArduinoDisplay()
else:
return MockDisplay()
if __name__ == "__main__":
display = Display()
print display
display.show("hello world")
L'instanciation fonctionne correctement, mais lorsque j'essaie de l'exécuter, j'obtiens :
ArduinoDisplay
Traceback (most recent call last):
File "tt.py", line 56, in <module>
display.show("hello world")
File "tt.py", line 41, in show
return arduino_display.println(message)
NameError: global name 'arduino_display' is not defined
L'importation de arduino_display
fonctionne en quelque sorte, mais je ne trouve pas le moyen de l'utiliser à l'intérieur de l'objet.
Les importations conditionnelles sont nécessaires car des modules différents sont installés sur différentes plates-formes.
Une idée sur la manière d'utiliser ces importations conditionnelles ?
J'ai essayé self.arduino_display
y ArduinoDisplay.arduino_display
mais en vain.
Je pourrais évidemment détecter les erreurs d'importation, comme dans le cas d'un ajout au sommet :
try:
import arduino_display
except:
pass
...et cela échouerait sur un RPI, ce qui serait très bien, mais il doit y avoir un meilleur moyen...