class MType(type):
 pass

class MClass(object):
 __metaclass__ = MType

a = MType


无论如何,从上面的代码片段中可以创建给定MClassa实例?

(可能很重要的一点是,我无法简单地构造MClass()

最佳答案

我可以想到两种简单的方法来查找元类的实例。一种是让元类在创建实例时跟踪其实例列表,如下所示:

class MType(type):
    instances = []    #list of instances of the metaclass

    def __init__(cls, name, bases, dct):
            MType.instances.append(cls)    #append to list of instances
            super(MType, cls).__init__(name, bases, dct)

class MClass(object):
    __metaclass__ = MType


现在MType.instances[<class '__main__.MClass'>]

另一种方法是使用
inspect module浏览给定模块中的类,并使用isinstance检查它们是否为MType的实例。这也不一定是一件疯狂的事情-例如,各种单元测试套件通过基于模块的名称和/或继承的类,通过查找似乎是测试的类和函数的模块来工作-我不是我确实确定为什么要使用元类来做到这一点。

09-27 06:45