如何从另一个模块访问对象?

时间:2018-10-03 07:49:52

标签: python dictionary object variables module

我有一个python脚本,它定义了几个这样的对象

# A.py
a - some dict
b - some dict
c - some dict
d - some dict

现在,我还有另一个脚本B.py,我想在其中访问a,b,c,d,但是它基于某些变量,我会选择使用哪个脚本

# By.py
import A as A_objects

input = 'a'

# Since the input is 'a' here, I want to call A_objects.a.value
print(A_objects.input.value) # Does not work

这是错误:

AttributeError: module 'A' has no attribute 'input'

对我来说,这听起来像是一个基本问题,但我找不到解决方案。我想到的一种方法是创建一个包含字符串和诸如此类的对象的字典

global_dict = { 'a': a, 'b': b ... }

global_dict.get(input)中以B.py的形式获取对象/字典 让我知道实现此用例的最佳实践是什么。

2 个答案:

答案 0 :(得分:3)

您只需执行getattr(A_objects, input)

答案 1 :(得分:1)

您的问题不是“从另一个模块访问对象”,而是通过其名称来解析属性(模块中定义的名称成为模块对象的属性)。对于任何对象,您都会遇到完全相同的问题,即:

class Foo():
    def __init__(self):
        self.a = 42

f = Foo()

name = 'a'

# now how to get 'f.<name>' ?

通用答案是内置的getattr(object, name[, default])函数:

print(f.a)
print(getattr(f, name))

因此,对于B.py,您想要的是

print(getattr(A_objects, input))

但是,如果要处理用户输入(对于“用户输入”的最大可能定义),则您很可能希望明确定义可以通过这种方式访问​​的名称-使用dict是最明显的解决方案:

# a.py

a = {}
b = {}
# etc

registry = {
   "a": a,
   "b": b,
   # etc
}

和:

# B.py
import A
input = 'a'
print(A.registry[input])