我构建的类中我知道属性的预期类型,但是Python当然不知道。虽然想要告诉它不是Python式的,假设我想告诉它,那么有没有一种惯用的方法来这么做?在
为什么:我读的是外来格式的数据(没有类型信息),其中包含嵌套在对象中的对象。将它放入嵌套字典很容易,但我希望它在类类型的对象中,以获得正确的行为以及数据。例如:假设我的类Book
有一个属性isbn
,我将用一个ISBNumber
对象填充该属性。我的数据将isbn作为字符串提供给我;我希望能够查看Book
并说“该字段应该由ISBNumber(theString)
填充。”
如果这个解决方案可以应用于我从别人那里得到的类而不必编辑他们的代码,那我就更高兴了。在
(我只限于2.6版,尽管我对3.x版的解决方案感兴趣,如果有的话)
有很多方法可以达到这样的效果。如果将输入格式耦合到对象模型是可以接受的,那么可以使用描述符来创建类型适配器:
但是,如果您不能完全控制消息结构,那么这种耦合不是一个好主意。在这种情况下,我喜欢使用解释器模式使输入消息适应输出类型。我创建了一个小框架,使我能够构建声明性对象结构来处理输入数据。在
框架可能如下所示:
^{pr2}$消息适配器如下所示:
请注意,消息结构名称可能与对象模型不同。在
消息处理本身如下所示:
我假设您已经考虑过
pickle
模块,它不适合您的目的。在这种情况下,可以将属性附加到类中,该属性指定每个属性的类型:在重建时,迭代
^{pr2}$_types
并尝试强制执行类型:在上面的代码示例中,
obj
是正在重建的对象,我假设属性已经以字符串格式(或者从非序列化中获得的任何内容)分配。在如果您希望它与无法更改源代码的第三方类一起使用,可以在从其他地方导入该类之后在运行时将
_types
属性附加到该类。例如:我也同意使用},如果你能完全控制从你的输入文件中得到什么,那么使用
__repr__
和{eval
会导致任意代码执行的可能性,这是相当危险的。在至少在原则上,这是一个对象的
__repr__
函数应该实现的功能:对象的无歧义重建。在如果类的定义如下:
那么您就离重建原始对象一步之遥了。另请参见pickle module。在
在ISBN类上进行即兴表演,然后给你一个书本类
^{pr2}$当然,你的对象可能不仅仅是构造和重建它们自己。。。还有塔玛斯提到的关于评估的警告。在
相关问题 更多 >
编程相关推荐