<p>我不知道足够的元类来说明做你正在尝试的事情是否是个坏主意,但这是可能的</p>
<p>您可以使<code>MetaCounter</code>只保留对其“元类化”类的引用,并通过更新<code>MetaCounter.__new__</code>方法中的<code>dict</code>为每个类添加特定的实例计数器:</p>
<pre class="lang-py prettyprint-override"><code>class MetaCounter(type):
_classes = []
def __new__(cls, name, bases, dict):
dict.update(_counter=0)
metaclassed = super().__new__(cls, name, bases, dict)
cls._classes.append(metaclassed)
return metaclassed
</code></pre>
<p>每次实例化一个新的<code>MetaCounter</code>类时,都会递增计数器</p>
<pre class="lang-py prettyprint-override"><code> def __call__(cls, *args, **kwargs):
cls._counter += 1
print(f'Instantiated {cls._counter} objects of class {cls}!')
return super().__call__(*args, **kwargs)
</code></pre>
<p>这确保了每个<code>MetaCounter</code>类都拥有自己的实例计数器,而不知道其他<code>MetaCounter</code>类的任何信息</p>
<p>然后,要获取所有计数器,可以将<code>_counters</code>静态方法添加到<code>MetaCounter</code>,该方法返回每个<code>MetaCounter</code>类的计数器:</p>
<pre class="lang-py prettyprint-override"><code> @classmethod
def _counters(cls):
return {klass: klass._counter for klass in cls._classes}
</code></pre>
<p>那么你就完成了:</p>
<pre class="lang-sh prettyprint-override"><code>print(MetaCounter._counters()) # {<class '__main__.Foo'>: 3, <class '__main__.Bar'>: 2}
print(Foo._counter) # 3
print(Bar._counter) # 2
</code></pre>