0

给定一个 Windows ini 风格的配置文件,例如“airplanes.ini”:

[JumboJet]
wingspan = 211
length = 231
seating = 416
crew = 2
unit_cost = 234000000
on_hand = 3

[SopwithCamel]
wingspan = 28
length = 18
armament = twin Vickers
crew = 1
on_hand = 1

[NCC1701]
length = 289 meters
crew = 430
speed = Warp 8
armament = 12 phasers, 6 photon torpedo

我使用 Python 2.7.3 库中的 ConfigParser 模块来读取文件的内容,然后使用内置type()函数为配置文件中的每个 [section] 创建一个类型为“Airplane”的新对象。每name = value对都成为对象的一个​​属性:

# create a config parser, using SafeConfigParser for variable substitution
config = ConfigParser.SafeConfigParser()

# read in the config file
config.read('airplanes.ini')

airplanes = []

# loop through each "[section]" of config file
for section in config.sections():
    # create a new object of type Airplane
    plane = type("Airplane",(object,),{"name":section})

    # loop through name = value pairs in section
    for name, value in config.items(section)
        # this is where the magic happens?
        setattr(plane, name, lambda: config.set(section,name,value))

    airplanes.append(plane)

# do stuff with Airplanes,
boeing = airplanes[1]

# this update needs to call through to config.set()
boeing.on_hand = 2

# then save the changes out to the config file on disk
with open('airplanes.ini','wb') as f:
    config.write(f)

注释“这就是魔法发生的地方”的行表示我想set()通过属性的“setter”设置对 ConfigParser 方法的调用以更新配置对象。我相信setattr(plane, name, value)这是创建属性的“通常”方式,但这不会调用config.set().

我希望灵活地将对象的属性动态定义为配置文件每个部分中的项目,即使每个部分中的项目不同,或者每个部分有不同数量的项目。

关于如何实现这一点的任何建议?我不认为 property() 或 setattr() 会做我想做的事。

4

1 回答 1

1

我认为动态地制作类型会使它过于复杂。相反,我会创建一个封装了plane 类型的类,并创建填充了文件中信息的实例。

然后,您有一个用于实际平面的单独类,其中包含一个 type 属性,该属性指向它所属的类型。

于 2012-12-20T00:55:20.600 回答