• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何动态地创建在Python一类的初始化

python 来源:ChaimG 5次浏览

下面是一些代码入手:如何动态地创建在Python一类的初始化

def objectify(name, fields): 
    """ Create a new object including the __init__() method. """ 
    def __init__(self, *argv): 
     for name, val in zip(var_names, argv): 
      setattr(self, name, val) 

    # The following line of code is currently limited to a single dynamic class. 
    # We would like to extend it to allow creating multiple classes 
    # and each class should remember it's own fields. 
    __init__.var_names = fields 

    result = type(name, (object,), dict(__init__=__init__)) 

这里的挑战是找到一种方法,使具有每个类的__init__()方法的独特副本它的变量名称的静态列表。

B计划: 我们可以使用eval()来运行函数生成的代码。但要尽可能避免使用eval()。这里面临的挑战是在没有eval()的情况下这样做。

编辑:虽然写了这个问题,我想出了一个解决方案。 (见下文)也许这会帮助别人。

编辑2:我会用这个函数来创建类似namedtuple()的东西,除了它们是可变的。

Point = objectify('point', ['x', 'y']) 
a = Point(1, 2) 
b = Point(2, 3) 
print a.__dict__ 
print b.__dict__ 

===========解决方案如下:

这里是一个解决方案:

def objectify(obj_name, fields): 
    """ Create a new object including the __init__() method. """ 

    def __init__(self, *argv): 
     """ Generic initializer for dynamically created classes. """ 
     fields = objectify.fields[self.__class__.__name__] 
     for field, val in zip(fields, argv): 
      setattr(self, field, val) 

    result = type(obj_name, (object,), dict()) 
    result.__init__ = __init__ 

    # Save the list of fields in a static dictionary that is retrieved by class name. 
    objectify.fields[obj_name] = fields 

    return result 

objectify.fields = {}   # A static local variable. 

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)