将某些属性从一个对象层次结构提取到另一个对象层次结构的'Pythonic'方法是什么?



假设我有这样的复杂类型:

class MyForm(wtforms.Form):
  firstname = wtforms.TextAreaField()
  lastname = wtforms.TextAreaField()

TextAreaField可以被强制为包含HTML的str()。它有一个名为data的属性,其中包含原始数据。它还有一个名为label的属性,其中包含用于显示标签的HTML。这就是我想从这个复杂类型中提取的三个值。

创建一个只包含我想要的属性的新对象的方法可能是什么?

类似。。。。

f = MyForm()
... populate f ...
x = {}
for k, v in f:
  x[k] = {'html1': str(v), 'data': v.data, 'html2': v.label}

我知道那都错了,救命!

稍后,我想能够说:

print x.firstname.data
print x.firstname.html1
print x.firstname.html2

写一个适配器类怎么样?

class TAFAdapter(object):
    def __init__(self, taf):
        self.taf = taf
    @property
    def data(self): return self.taf.data
    @property
    def html1(self): return str(self.taf)
    @property
    def html2(self): return self.taf.label

那么你所要做的就是:

class MyForm(...):
    def __init__(self):
        self.firstname = TAFAdapter(wtforms.TextAreaField())
        ...

根据您的需要,您可以让TAFAdapter直接实例化TextAreaField,也可以将其通用化以用于其他表单字段。。。

最新更新