我有一个类,它可以作为许多不同类型变量的容器。该集合是有限的,不是很大,所以我没有使用字典。有没有办法根据构造函数中是否请求(指定为True / False)来自动化或缩短变量的创建?
以下是我的例子:
class test:
def __init__(self,a=False,b=False,c=False):
if a: self.a = {}
if b: self.b = 34
if c: self.c = "generic string"
对于在构造函数中为true的a,b,c中的任何一个,它们将在对象中创建。
我有一些标准变量(a,b,c,d ..)的集合,有些对象会有,而有些对象则没有。组合的数量太大,无法创建单独的类,但变量的数量不足以在每个类中为它们设置字典。
在python中有什么方法可以做这样的事情:
class test:
def __init__(self,*args):
default_values = {a:{},b:34,c:"generic string"}
for item in args:
if item: self.arg = default_values[arg]
也许有另外一种方法可以做到这一点?
编辑:
为了澄清这一类,它表示2D表面上不同类型的边界框。根据框的功能,它可以包含任何框架坐标,内部交叉坐标,id,人口统计(附加到该框)以及一些其他缓存值,以便于计算。
我不希望将每个对象都作为字典,因为它附加了一些方法,允许它导出和修改其内部数据并与相同类型的其他对象交互(类似于字符串与+交互的方式 - .join等)。我也不想在每个对象中都有一个字典,因为对该变量的调用是不优雅的:
print foo.info["a"]
与
print foo.a
感谢ballsdotball,我想出了一个解决方案:
class test:
def __init__(self, a=False, b=False,c =False):
default_values = {"a":{},"b":34,"c":"generic string"}
for k, v in default_values.iteritems():
if eval(k): setattr(self,k,v)
答案 0 :(得分:1)
可能是这样的:
def __init__(self,*args,**kwargs):
default_values = {a:{},b:34,c:"generic string"}
for k,v in kwargs.iteritems():
try:
if not v is False:
setattr(self,k,default_values[k])
except Exception, e:
print "Argument has no default value.",e
但说实话,我只是将默认值放在init参数中,而不是像那样测试它们。
*编辑了几次语法。
答案 1 :(得分:0)
你可以继承dict
(如果你没有使用位置参数):
class Test(dict):
def your_method(self):
return self['foo'] * 4
如果__getattr__
语法困扰您,您还可以覆盖__setattr__
和self['foo']
:
class Test(dict):
def __getattr__(self, key):
return dict.__getattr__(self, key)
def __setattr__(self, key, value):
return dict.__getattr__(self, key, value)
def your_method(self):
return self.foo * 4