0

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

对于在构造函数中为真的 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 交互的方式, ETC。)。我也不想在每个对象中都有一个字典,因为对该变量的调用是不优雅的:

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)
4

2 回答 2

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 参数一起放入,而不必像那样测试它们。

*编辑了几次语法。

于 2013-05-29T17:11:12.083 回答
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
于 2013-05-29T17:12:31.570 回答