我正在开发一个智能家居项目。我有很多东西,比如一些 XBee readios、LED、GPS 同步时钟、水计数器等。我尝试使用 OOP 方法,所以我创建了许多类和子类。现在,您在代码中要做的就是定义硬件,通过类内置函数将其连接到父级并享受。 获得一个想法:
coordinator = XBee24ZBCoordinator('/dev/ttyS1', 115200,
"\x00\x13\xA2\x00\x40\x53\x56\x23", 'coord')
spalnya = XBee24ZBRemote('\x00\x13\xA2\x00\x40\x54\x1D\x12', 'spalnya')
spalnya.connectToCoordinator(coordinator)
vannaya = XBee24ZBRemote('\x00\x13\xA2\x00\x40\x54\x1D\x17', 'vannaya')
vannaya.connectToCoordinator(coordinator)
led = LED()
led.connectTo(spalnya.getPin('DO4'), 'DO')
led.on()
led.off()
但是,我不想在代码中这样做。我想要一个 ini 文件来定义这个“网络”的拓扑。因此,我希望该文件可供人类读取和编辑。逻辑选择是 ini (相对于 e.j. json,因为 json 在手动编辑配置文件时至少对我来说不是 super 友好)。 现在,我得到了:
[xbee-coordinator]
type = XBee24ZBCoordinator
name = coord
comport = COM4
comspeed = 115200
我可以创建一个函数 BuildNetwork('my.ini'),它将读取并创建所需的对象实例以及它们之间的连接。我该怎么做?有一个类 XBee24ZBCoordinator,但我从 ini 得到的只是一个字符串...
最佳答案
您有两个选择:
在模块中定义所有这些类。模块只是对象,因此您可以对它们使用
getattr()
:import types instance = getattr(types, typename)(arguments)
将它们全部存储在字典中并按名称查找;您不必在字符串中键入名称,该类具有您可以重复使用的
__name__
属性:types = {} class XBee24ZBCoordinator(): # class definition types[XBee24ZBCoordinator.__name__] = XBee24ZBCoordinator
如果这些是在“当前”模块中定义的,则 globals()
函数也会返回一个字典,因此 globals()['XBee24ZBCoordinator']
是一个引用以及类定义。
关于python - 当 ini 文件设置类型时创建一组对象 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14296380/