<p><strong>已更新</p>
<p>正如我所评论的,我认为您可能混淆了实例属性和类属性,并且非常希望跟踪后者。实例属性是动态的,可以随时添加、更改或删除,因此尝试使用问题中所示的元类进行此操作是行不通的(不同的实例可能定义了不同的一组实例)。你知道吗</p>
<p>通过重载类的两个特殊方法,即<code>__setattr__()</code>和<code>__delattr__()</code>,并将它们的效果存储在私有数据成员(即<a href="http://code.activestate.com/recipes/576694" rel="nofollow">^{<cd3>}</a>)中,可以跟踪它们的创建和删除。这样做将跟踪它们是什么,并保持它们被创建的顺序。你知道吗</p>
<p>这两种方法都需要小心,不要对私有数据成员本身进行操作。你知道吗</p>
<p>也就是说,这里有一些东西说明了这种实现:</p>
<pre><code># -*- coding: iso-8859-1 -*-
# from http://code.activestate.com/recipes/576694
from orderedset import OrderedSet
class AreaFisicoAmbiental(object):
def __init__(self, persona, datos):
self._members = OrderedSet()
self.persona = persona
self.tipoEdificacion = datos[0]
self.tipoDeParedes = datos[1]
def __setattr__(self, name, value):
object.__setattr__(self, name, value)
if name != '_members':
self._members.add(name)
def __delattr__(self, name):
if name != '_members':
object.__delattr__(self, name)
self._members.discard(name)
def methodA(self, value1, value2): # add some members
self.attribute1 = value1
self.attribute2 = value2
def methodB(self):
del self.attribute1 # remove a member
if __name__ == '__main__':
a = AreaFisicoAmbiental('Martineau', ['de albañilería', 'vinilo'])
a.methodA('attribute1 will be deleted', 'but this one will be retained')
a.methodB() # deletes a.attribute1
a.attribute3 = 42 # add an attribute outside the class
print('current members of "a":')
for name in a._members:
print(' {}'.format(name))
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>current members of "a":
persona
tipoEdificacion
tipoDeParedes
attribute2
attribute3
</code></pre>
<p>最后一点:可以创建一个元类,将这两个方法自动添加到客户机类中,这样可以更容易地修改现有的类。他说</p>