目标是使用__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}
答案 0 :(得分:2)
由于您没有为班级定义自定义__str__
method,print
正在调用父班__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])