选择要在初始化类时创建的变量

时间:2013-05-29 17:04:07

标签: python class variables constructor args

我有一个类,它可以作为许多不同类型变量的容器。该集合是有限的,不是很大,所以我没有使用字典。有没有办法根据构造函数中是否请求(指定为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)

2 个答案:

答案 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