繁体   English   中英

通过ini文件设置对象类型时创建一组对象(Python)

[英]Create a set of objects when their type is set by ini file (Python)

我正在做一个智能家居项目。 我有很多东西,例如少数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(在手动编辑配置文件时,与ej json相反,至少对我来说不是超级友好)。 现在,我得到了:

[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 

如果这些是在'current'模块中定义的,那么globals()函数也会返回一个字典,因此globals()['XBee24ZBCoordinator']也是对类定义的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM