我有以下代码:
class test():
def __init__(self):
def tt(self, dic):
for value, item in dic:
setattr(self, item, value)
lar = {'a': 2, 'b': 3}
lbr = {'c': 4, 'd': 8}
lcr = {'e': 5, 'f': 0}
dic = {'ar': lar, 'br': lbr, 'lcr': lcr}
for value, item in dic:
setattr(self, item, tt(self.item, value))
rrr = test()
print(rrr.ar.gg)
我想知道我是否可以这样做,我需要为另一个项目使用函数'tt',但要把它放在这里很重,这个想法保持不变。
我需要从for循环中的函数生成子类
答案 0 :(得分:1)
这样的东西?
class Data(object):
def __init__(self, **data):
for k, v in data.items():
setattr(self, k, v)
class Test(object):
def __init__(self):
kwmap = {
'ar': {'a': 2, 'b': 3},
'br': {'c': 4, 'd': 8},
'cr': {'e': 5, 'f': 0}
}
for attrname, kw in kwmap.items():
setattr(self, attrname, Data(**kw))
rrr = Test()
print(rrr.ar.b) # should output 3
注意:我从Data
中提取了Test.__init__
类,因为它并不依赖于Test.__init__
中的任何局部变量,但您当然可以在任何您认为合适的地方声明 - 只是请记住,在函数中使用类定义意味着每次调用函数时都会创建一个新的类对象,这会浪费资源并且会根据类标识中断任何测试。
NB2:如果你需要你的对象是不同的类,那么只需将类放在映射中 - python类就是它们自己的对象(就像函数,模块等):
class A(object):
def __init__(self, a, b):
self.a = a
self.b = b
class B(object):
def __init__(self, c, d):
self.c = c
self.d = d
class C(object):
def __init__(self, e, f):
self.e = e
self.f = f
class Test2(object):
def __init__(self, specs):
for attrname, (cls, kw) in specs.items():
setattr(self, attrname, cls(**kw))
test2 = Test2({
'ar': (A, {'a': 2, 'b': 3}),
'br': (B, {'c': 4, 'd': 8}),
'cr': (C, {'e': 5, 'f': 0})
})
print(test2.ar.b) # should output 3