局部作用域类的内省(python)
当我试图通过中的一些建议使用内省从字符串导航到类时,我注意到给定的方法无法在函数的局部作用域中找到类。考虑下面的代码:局部作用域类的内省(python),python,python-2.7,Python,Python 2.7,当我试图通过中的一些建议使用内省从字符串导航到类时,我注意到给定的方法无法在函数的局部作用域中找到类。考虑下面的代码: import sys def f(): class LocalClass: pass print LocalClass print 'LocalClass' in dir(sys.modules[__name__]) 它给出了输出 __main__.LocalClass False 我有点困惑,为什么根据类对象本身,LocalClass似乎
import sys
def f():
class LocalClass:
pass
print LocalClass
print 'LocalClass' in dir(sys.modules[__name__])
它给出了输出
__main__.LocalClass
False
我有点困惑,为什么根据类对象本身,LocalClass似乎属于主模块,但无法通过sys.modules访问。有人能解释一下吗
是否有一种方法可以从字符串生成类,即使该类仅在非全局范围内?在函数
f
中,LocalClass
确实是本地的。您可以通过尝试\uuuu main\uuuuu.LocalClass
并看到引发了AttributeError:'module'对象没有属性'LocalClass'
至于类返回\uuuuu main\uuuu.LocalClass
的原因,是因为默认情况下,\uuuuuuu repr\uuuu
函数返回
dir
找不到它的原因是它只查看在其作用域中定义的变量LocalClass
是本地的,因此如果您查看主模块,它将不会显示
从字符串创建类的方法有很多种
第一个也是最容易理解的方法是使用exec
。现在,您不应该只使用exec
来处理随机事件,所以我不建议使用此方法
第二种方法是使用type
函数。它的帮助页面返回类型(名称、基数、dict)
。这意味着您可以创建一个名为LocalClass
的类,子类为object
,属性foo
设置为“bar”,方法是执行type(“LocalClass”),(object,),{foo:“bar”})
并在变量中捕获返回的类。您可以通过执行globals()[“LocalClass”]=…
PS:获取主模块的一种更简单(不确定是否更漂亮)的方法是执行import\uuuu main\uuuu
。这可以在任何模块中使用,但我通常建议不要使用它,除非您知道自己在做什么,因为一般来说,python人员不喜欢您做这种事情
编辑:查看链接问题后,您不希望动态创建新类,而是希望检索给定名称的变量。链接问题中的所有答案都可以做到这一点。我让你自己决定你最喜欢哪一个
EDIT2:
LocalClass.\uuuuu模块\uuuu
与\uuuu main\uuuu
相同,因为这是您定义类的模块。如果您在模块Foo
中定义了它,该模块由\uuuuuu main\uuuuuuu
导入(并且实际上不是独立运行的),您会发现\uuuuuu module\uuuuu
将是“B”。尽管LocalClass
是在\uuuuu main\uuuuu
中定义的,但它不会自动进入全局表,因为它是一个类-在python中,正如您可能已经知道的,(几乎)一切都是一个对象。dir
函数搜索范围中定义的所有变量。当您在主范围中查看时,它几乎等同于执行\uuu dict\uuu
或globals()
,但有一些细微的区别。因为LocalClass
是本地的,所以它没有在全局上下文中定义。但是,如果您在函数f
中执行了locals()
,您会发现LocalClass
将出现在该列表中该dir
函数以您使用它的方式返回全局值。Hm。。但是如果同时dir
告诉我们LocalClass
不属于主模块,为什么LocalClass.\uuuuuuu
等于?至于第二部分——如果问题不清楚,很抱歉,但我并没有试图从字符串中定义本地范围内的新类——而是尝试获取与该字符串对应的classobj实例。