【问题标题】:Given a python 2.7.2 type is there anyway I can construct a class instance programmatically?给定一个 python 2.7.2 类型,我可以以编程方式构造一个类实例吗?
【发布时间】:2012-03-18 22:33:27
【问题描述】:
class MType(type):
 pass

class MClass(object):
 __metaclass__ = MType

a = MType

从上面的 sn-p 无论如何我可以在给定a 的情况下创建MClass 的实例吗?

(请注意,我不能简单地构造MClass()

【问题讨论】:

  • 您是否假设您知道“MClass”是什么(即按名称询问?).. 或者您是否希望“a”能够自动找到它?如果是这样,您是否关心它是否继承自两个类?
  • 不,不一定知道 MClass 是什么。我在想也许在 python 中有一种方法可以让类给定一个类型。但是我想无论如何那里没有1:1的关系。没什么大不了的,一千种剥猫皮的方法

标签: python class types constructor instance


【解决方案1】:

这是一种可怕的做法。虽然,我会说实话.. 我不确定将 __metaclass__ 设置为模块属性与继承之间有什么区别。

class MType(type):
    pass

class MClass(MType):
    pass

a = MType

print a.__mro__[0].__subclasses__(a)

产量:

[<class '__main__.MClass'>]

【讨论】:

  • 刚刚开始学习,但我发现 python 的灵活性令人着迷。对于引发此问题的问题,我只是重新安排了我的模块结构以更清晰,但感谢您让我了解 MRO。
  • 请注意,这不适用于元类,因为在这种情况下,MClassMType 的实例而不是子类。
【解决方案2】:

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

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[&lt;class '__main__.MClass'&gt;]

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

【讨论】:

    【解决方案3】:

    不,如果你有b = MClass,你可以简单地做obj = b(),但元类并不“知道”它被设置为元类的类。

    如果变量中有类,则可以在a 上调用__new__,无论是b 还是MClass

    【讨论】:

      猜你喜欢
      • 2012-12-15
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2010-12-07
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多