初始化从具有特定字典的类构建的对象

时间:2015-01-05 04:22:19

标签: python class inheritance dictionary python-2.x

目标是使用__init__方法构建一个类,该方法将允许创建将使用特定字典初始化的对象。

详细信息:

文件mydicts.py是各种词典的集合。 从我打算创建的类构建的对象将初始化为mydicts.py中的一个字典。

mydicts.py示例:

dict1 = {k1:v1, k2:v2,...,kn:vn}
dict2 = {k1:v1, k2:v2,...,km:vm}
etc.

我的尝试:

class Example(dict):
    def __init__(self, dictx):
        self.dictx = getattr(__import__("mydicts", fromlist=['m']), dictx)

结果:

e = Example('dict1')
print e
{}        # <- got empty dictionary. Want {k1:v1, k2:v2,...,kn:vn}

目标是创建以下对象:

a = Example(dict1)
print a
# {k1:v1, k2:v2,...,kn:vn}

b = Example(dict2)
print b
# {k1:v1, k2:v2,...,km:vm}

2 个答案:

答案 0 :(得分:2)

由于您没有为班级定义自定义__str__ methodprint正在调用父班__str__的{​​{1}}方法。此外,这导致Python打印由dict中的父类创建的空字典,而不是您在dict.__new__中存储的字典。

因为您的类继承自self.dictx,所以您应该将dict返回的字典传递给父类的getattr方法。您可以使用super

__init__

这将使用从class Example(dict): def __init__(self, dictx): dct = getattr(__import__("__main__", fromlist=['m']), dictx) super(Example, self).__init__(dct) 获取的数据初始化父类。换句话说,空字典已被dct返回的字典替换。因此,当getattr调用父{m} print方法时,将给出正确的输出:

__str__

另一种解决方案是为您的类定义一个自定义>>> dict1 = {'k1':'v1', 'k2':'v2', 'kn':'vn'} >>> class Example(dict): ... def __init__(self, dictx): ... dct = getattr(__import__("__main__", fromlist=['m']), dictx) ... super(Example, self).__init__(dct) ... >>> e = Example('dict1') >>> print e {'k2': 'v2', 'k1': 'v1', 'kn': 'vn'} >>> 方法,该方法将__str__作为字符串返回:

self.dictx

但请注意,如果您使用此方法,则从class Example(dict): def __init__(self, dictx): self.dictx = getattr(__import__("mydicts", fromlist=['m']), dictx) def __str__(self): return str(self.dictx) 继承并不是一个真正的理由,因为您的类不是新类型的字典;它只有一个存储为属性的字典。

答案 1 :(得分:1)

我认为你这使得它变得比它需要的复杂得多。注意到the manual says

  

直接使用__import__()的情况很少见,除非您要导入名称仅在运行时已知的模块。

但是你知道加载时的模块名称,你的数据定义只有太多的变量名。更清楚的是my_dicts.py

my_dicts = [
    {k1:v1, k2:v2,...,kn:vn},
    {k1:v1, k2:v2,...,km:vm},
    …
]

example.py

import my_dicts

class Example(dict):
    def __init__(self, n):
        """Returns an Example instance loaded with the nth element
           of my_dict."""
        super(Example, self).__init__(my_dicts.my_dicts[n])