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

下面是一些代码入手:如何动态地创建在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.

回答:

你没有后来提及关于字段的用法什么。如果你只需要他们__init__,你并不需要保存在所有:

def objectify(name, fields): 

""" Create a new object including the __init__() method. """

fields = fields[:]

def __init__(self, *argv):

for name, val in zip(fields, argv):

setattr(self, name, val)

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

return result

否则,你应该看看元类 - 这正是他们的用例。

更新:制作副本fields确保更改调用方中的列表不会影响存储的列表。值仍然可以改变...留给练习读者来验证一切是str

以上是 如何动态地创建在Python一类的初始化 的全部内容, 来源链接: utcz.com/qa/260338.html

回到顶部