擅长:python、mysql、java
<p>如果希望<code>__init__</code>同时处理属性和列,尽管拥有一个专用的<code>classmethod</code>工厂似乎是一种更干净的方法,但以下实现可以用作抽象基础:</p>
<pre><code>from sqlalchemy import inspect
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
def _create_col_lookup(mapper):
return {c.name: k for k, c in mapper.columns.items()}
class ColBase(Base):
__abstract__ = True
def __init__(self, *args, **kwargs):
# Create a lookup of column name -> attr key
ctoa = _create_col_lookup(inspect(self).mapper)
# Process intersecting keys
for k in ctoa.keys() & kwargs.keys():
setattr(self, ctoa[k], kwargs.pop(k))
super().__init__(*args, **kwargs)
</code></pre>
<p>使用上述方法,以下断言通过:</p>
^{pr2}$