回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我试图从一些Python类的定义中自动创建一些SQL表,我尝试使用<code>dir()</code>,但是由于它返回Python字典,所以它没有排序,因此类成员的定义顺序丢失。你知道吗</p>
<p>在网上阅读时,我发现以下内容<a href="https://docs.python.org/3/reference/datamodel.html#metaclass-example" rel="nofollow">here</a></p>
<pre><code>class OrderedClass(type):
@classmethod
def __prepare__(metacls, name, bases, **kwds):
return collections.OrderedDict()
def __new__(cls, name, bases, namespace, **kwds):
result = type.__new__(cls, name, bases, dict(namespace))
result.members = tuple(namespace)
return result
class A(metaclass=OrderedClass):
def one(self): pass
def two(self): pass
def three(self): pass
def four(self): pass
>>> A.members
('__module__', 'one', 'two', 'three', 'four')
</code></pre>
<p>我成功地实现了它的一个副本,它似乎在做它应该做的事情,只是它只保存了<code>members</code>变量中的<code>methods</code>,我还需要有<strong><code>class</code>成员变量</strong>。你知道吗</p>
<p>问题:</p>
<p>我怎样才能得到一个成员变量的列表来保持它们的定义顺序?,我不关心类方法,实际上我忽略了它们。你知道吗</p>
<p><strong>注意</strong>:之所以顺序很重要,是因为这些表将具有引用某些表列的约束,并且这些约束必须在定义列之后,但它们出现在前面。你知道吗</p>
<p><strong>编辑</strong>:这是我实际程序中的一个示例类</p>
<pre><code>class SQLTable(type):
@classmethod
def __prepare__(metacls, name, bases, **kwds):
return OrderedDict()
def __new__(cls, name, bases, namespace, **kwds):
result = type.__new__(cls, name, bases, dict(namespace))
result.members = tuple(namespace)
return result
class AreaFisicoAmbiental(metaclass = SQLTable):
def __init__(self, persona, datos):
# edificacion
self.persona = persona
self.tipoEdificacion = datos[0]
self.tipoDeParedes = datos[1]
self.detallesTipoDeParedes = datos[2]
self.tipoDeTecho = datos[3]
self.detallesTipoDeTecho = datos[4]
self.tipoDePiso = datos[5]
self.detallesTipoDePiso = datos[6]
# ambientes
self.problemaDeInfraestructura = datos[7]
self.detallesProblemaDeInfraestructura = datos[9]
self.condicionDeTenencia = datos[10]
self.detallesCondicionDeTenencia = datos[11]
self.sala = toBool(datos[12])
self.comedor = toBool(datos[13])
self.baño = toBool(datos[14])
self.porche = toBool(datos[15])
self.patio = toBool(datos[16])
self.lavandero = toBool(datos[17])
self.habitaciones = toInt(datos[19])
# servicios básicos
self.aguasServidas = toBool(datos[21])
self.aguaPotable = toBool(datos[22])
self.luz = toBool(datos[23])
self.gas = datos[24]
self.internet = toBool(datos[25])
</code></pre>
<p>做</p>
<pre><code>print(AreaFisicoAmbiental.members)
</code></pre>
<p>输出:
你知道吗</p>
<pre class="lang-none prettyprint-override"><code>('__module__', '__qualname__', '__init__')
</code></pre>
<p>变量名是西班牙语的,因为它们的名称将用作表列名,也用作从数据库结构生成的web应用程序的标签。你知道吗</p>
<p>我知道Django做了类似的事情,但是我已经有了数据库检查器,它做了相反的事情,所以我知道我需要类似Django的功能来使用我的生成器。你知道吗</p>