有什么方法可以自动为 python 创建构造函数吗?
Is there any way to automatically create a constructor for python?
我有一个像下面这样的class C
,我不能像C("a", 1, 2.5)
那样构造它。
class C(object):
def __init__(self):
self.A = ""
self.B = 0
self.C = 1.2
所以我写了下面的函数make_c
。
def make_c(a, b, c):
c = C()
c.A = a
c.B = b
c.C = c
然而,这并不整洁,我必须为每个 CLS
创建不同版本的 make_CLS
。所以我想知道是否有一些方法我不需要写 make_c
.
也许下面的代码可行,但我不知道这是否是最好的方法,因为需要 exec
,我仍然必须命名所有字段。
def make_common(cls_name, fields_map):
o = eval(cls_name)
for k,v in fields_map.iteritems():
exec "o.{}={}".format(k, v)
return o
这个问题在Python2下,不过如果只有Python3有更好的办法,我也愿意知道
--编辑--
我无法更改class C
的定义,因为这些代码都是由其他程序生成的。
为什么不直接添加要传递给 __init__()
函数的变量?
class C(object):
def __init__(self,a , b, c):
self.A = a
self.B = b
self.C = c
test = C("a", 1, 2.5)
test.A
#'a'
也许是这样的?这避免了使用 eval
def make_class(cls_name, fields):
my_class = globals()[cls_name]()
my_class.__dict__.update(fields)
return my_class
然后
my_class = make_class('C', {'a':1, 'b':2, 'c':3})
我有一个像下面这样的class C
,我不能像C("a", 1, 2.5)
那样构造它。
class C(object):
def __init__(self):
self.A = ""
self.B = 0
self.C = 1.2
所以我写了下面的函数make_c
。
def make_c(a, b, c):
c = C()
c.A = a
c.B = b
c.C = c
然而,这并不整洁,我必须为每个 CLS
创建不同版本的 make_CLS
。所以我想知道是否有一些方法我不需要写 make_c
.
也许下面的代码可行,但我不知道这是否是最好的方法,因为需要 exec
,我仍然必须命名所有字段。
def make_common(cls_name, fields_map):
o = eval(cls_name)
for k,v in fields_map.iteritems():
exec "o.{}={}".format(k, v)
return o
这个问题在Python2下,不过如果只有Python3有更好的办法,我也愿意知道
--编辑--
我无法更改class C
的定义,因为这些代码都是由其他程序生成的。
为什么不直接添加要传递给 __init__()
函数的变量?
class C(object):
def __init__(self,a , b, c):
self.A = a
self.B = b
self.C = c
test = C("a", 1, 2.5)
test.A
#'a'
也许是这样的?这避免了使用 eval
def make_class(cls_name, fields):
my_class = globals()[cls_name]()
my_class.__dict__.update(fields)
return my_class
然后
my_class = make_class('C', {'a':1, 'b':2, 'c':3})