<p>有很多方法可以达到这样的效果。如果将输入格式耦合到对象模型是可以接受的,那么可以使用描述符来创建类型适配器:</p>
<pre><code>class TypeAdaptingProperty(object):
def __init__(self, key, type_, factory=None):
self.key = key
self.type_ = type_
if factory is None:
self.factory = type_
def __get__(self, instance, owner):
if instance is None:
return self
return getattr(instance, self.key)
def __set__(self, instance, value):
if not isinstance(value, self.type_):
value = self.factory(value)
setattr(instance, self.key, value)
def __delete__(self, instance):
delattr(instance, self.key)
class Book(object):
isbn = TypeAdaptingProperty('isbn_', ISBNNumber)
b = Book()
b.isbn = 123 # Does the equivalent of b.isbn = ISBNNumber(123)
</code></pre>
<p>但是,如果您不能完全控制消息结构,那么这种耦合不是一个好主意。在这种情况下,我喜欢使用解释器模式使输入消息适应输出类型。我创建了一个小框架,使我能够构建声明性对象结构来处理输入数据。在</p>
<p>框架可能如下所示:</p>
^{pr2}$
<p>消息适配器如下所示:</p>
<pre><code>book_message_adaptor = ObjectAdaptor(Book, kwargs={
'isbn': Pick('isbn_number', TypeWrapper(ISBNNumber)),
'authors': Pick('authorlist', ListAdaptor(TypeWrapper(Author)))
})
</code></pre>
<p>请注意,消息结构名称可能与对象模型不同。在</p>
<p>消息处理本身如下所示:</p>
<pre><code>message = {'isbn_number': 123, 'authorlist': ['foo', 'bar', 'baz']}
book = book_message_adaptor(message)
# Does the equivalent of:
# Book(isbn=ISBNNumber(message['isbn_number']),
# authors=map(Author, message['author_list']))
</code></pre>