【发布时间】:2020-05-15 23:29:54
【问题描述】:
我想创建一个抽象工厂,以便在 Python 2.7 中抽象出计算机(比如 RaspberryPi 和 Arduino)之间的硬件差异。
我正在使用抽象工厂的以下实现:
'''
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")
实例化工作正常,但是当我尝试运行它时,我得到:
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
所以arduino_display 的导入确实有效,但我找不到在对象中使用它的方法。
需要有条件的导入,因为不同的平台会安装不同的模块。
知道如何使用这些条件导入吗?
我尝试了self.arduino_display 和ArduinoDisplay.arduino_display,但无济于事。
我显然可以捕获导入错误,例如,添加到顶部:
try:
import arduino_display
except:
pass
...这会在 RPI 上失败,这很好,但必须有更好的方法...
【问题讨论】:
-
有一个错字:ArduionDisplay 在里面。
-
您是否尝试过使导入全球化?
-
修正了错字。
-
问题是您的导入没有在任何地方保存以供其他方法查看,因此它们在其他任何地方都不可见,只能在本地看到。导入后尝试设置
ArduinoDisplay.arduino_display = arduino_display。您可能需要使用ArduinoDisplay.arduino_display = staticmethod(arduino_display)中的静态方法。现在,在show中使用ArduinoDisplay.arduino_display,即保存的导入。
标签: python abstract-factory new-style-class