擅长:python、mysql、java
<p>一种比Django的方法更通用的方法是,Python2中可用的<code>__slots__</code><em>和</em>,这就是元类:</p>
<pre><code>class OrderedTypeMeta(type):
def __new__(mcls, clsname, bases, clsdict):
attrs = clsdict.get('_attrs_', [])
attrnames = []
for name, value in attrs:
clsdict[name] = value
attrnames.append(name)
clsdict['_attrs_'] = attrnames
return super(OrderedTypeMeta, mcls).__new__(mcls, clsname, bases, clsdict)
class User(DataStructure):
__metaclass__ = OrderedTypeMeta
_attrs_ = (('name', StringValue()),
('password', StringValue()),
('age', IntegerValue()))
</code></pre>
<p>我说它比django的方法更通用,因为您不需要属性是特定类的实例,任何值都可以。它也比<code>__slots__</code>更通用,因为您仍然可以为类的实例分配属性(尽管这可能不需要:在这种情况下,我更喜欢<code>__slots__</code>)。在Python3中,我更喜欢<code>__prepare__</code>。在</p>
<p>除了它有点难看之外,它的主要缺点是它不能与继承一起工作。将<code>__attrs__</code>从基类中取出并扩展它而不是将其设置为空列表并不困难。在</p>