【问题标题】:Dynamically building up types in python在python中动态构建类型
【发布时间】:2010-08-03 16:29:41
【问题描述】:

假设我正在构建一组复合类型:

def subordinate_type(params):
   #Dink with stuff
   a = type(myname, (), dict_of_fields)
   return a()

def toplevel(params)
    lots_of_types = dict(keys, values)
    myawesomedynamictype = type(toplevelname, (), lots_of_types)

    #Now I want to edit some of the values in myawesomedynamictype's 
    #lots_of_types. 

    return myawesomedynamictype()

在这种特殊情况下,我希望引用插入到lots_of_types 中的“typeclass”myawesomedynamictype

我试图遍历lots_of_types 并设置它,假设引用指向同一个东西,但我发现myawesomedynamictype 已损坏并丢失了它的字段。

我要解决的问题是我得到了与subordinate_type 类型相关的值,我需要根据subordinate_type 生成一个toplevel 实例化。

【问题讨论】:

  • 你能发布一些演示问题的玩具代码吗?
  • 为什么你的基类不是object
  • @SilentGhost:似乎不需要。
  • 但是出于什么特定目的您需要对插入到 lots_of_types 中的“类型类”myawesomedynamictype 的引用吗?这只能是稍后访问构造函数、方法(或成员),或者用于类型检查,或者以某种奇怪的方式实现继承。没有一个听起来像 Pythonic - 你以后用这个参考做什么?
  • @smci:我对问题的具体情况一无所知。这是将近一年前的事了。我正在做一些元编程。

标签: python types metaprogramming


【解决方案1】:

这是一个古老的问题,因为不清楚代码试图做什么(作为代码要点而不是工作代码),所以有点难以回答。

但听起来您希望在类本身上引用动态创建的类“myawesomedynamictype”。当您调用 type() 来构造它时,字典lots_of_types 的副本(我相信是副本)变成了这个新类的__dict__

所以,只需在类上设置一个新属性,使其具有刚刚构建的类的值;这就是你所追求的吗?

def toplevel(params)
    lots_of_types = dict(keys, values)
    myawesomedynamictype = type(toplevelname, (), lots_of_types)
    myawesomedynamictype.myawesomedynamictype = myawesomedynamictype
    return myawesomedynamictype()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2014-02-15
    相关资源
    最近更新 更多