Python decorator内部带有super()的NameError
使用Python2.7 我正在使用decorators在导入时创建一个对象库,并且在导入时对每个对象的实例进行一些检查;主要是重复检查 我最近切换到使用Python decorator内部带有super()的NameError,python,python-2.7,super,python-decorators,Python,Python 2.7,Super,Python Decorators,使用Python2.7 我正在使用decorators在导入时创建一个对象库,并且在导入时对每个对象的实例进行一些检查;主要是重复检查 我最近切换到使用super()以利用其多重继承处理,但它会在实例化的对象上引发namererror 简化代码突出显示问题: 输出 来自测试导入的>>* 创建的库 正在添加到库-->A的对象 实例 正在添加到库-->B的对象 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“testing.py”,第25行,在 B类(对象): 文件“testing.py
super()
以利用其多重继承处理,但它会在实例化的对象上引发namererror
简化代码突出显示问题:
输出
来自测试导入的>>*
创建的库
正在添加到库-->A的对象
实例
正在添加到库-->B的对象
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“testing.py”,第25行,在
B类(对象):
文件“testing.py”,第14行,在注册表中
测试库添加对象(obj)
文件“testing.py”,第8行,在add_obj中
inst=obj()
文件“testing.py”,第27行,在_init中__
super(B,self)。\uuuuu init\uuuuuuu()
NameError:未定义全局名称“B”
似乎有一个范围问题?除去装饰器,类B可以毫无问题地实例化
有什么建议吗?您正在尝试在完成定义之前实例化
B
修复它:
从库中删除这些行。添加\u obj()
:
为什么?
装饰器
Reg
涉及B
的定义。因此,在退出Reg
之前,您将无法通过该名称实例化B
。您试图在定义完B
之前实例化它
修复它:
从库中删除这些行。添加\u obj()
:
为什么?
装饰器
Reg
涉及B
的定义。因此,在退出Reg
之前,您将无法通过该名称实例化B
。嗨,Stephen,谢谢您的回复。我在Lib.add_obj()中实例化,因为我想对实例进行一些错误检查,所以它在那里是有用途的。你能详细说明一下“Reg涉及到B的定义”吗。为什么Reg不会以同样的方式影响A的定义?如果您想在super中使用名称B
,您不能这样做,因为B
在装饰程序退出之前不存在。嗨,Stephen,谢谢您的回复。我在Lib.add_obj()中实例化,因为我想对实例进行一些错误检查,所以它在那里是有用途的。你能详细说明一下“Reg涉及到B的定义”吗。为什么Reg不会以相同的方式影响A的定义?如果要在super中使用名称B
,则不能这样做,因为B
在装饰程序退出之前不存在。
class Lib(object):
def __init__(self):
print "library created"
self.lib = {}
def add_obj(self, obj):
print "object being added to library --> %s" % obj.__name__
inst = obj()
print inst.name
self.lib[obj.__name__] = obj
def Reg(obj):
global test_lib
test_lib.add_obj(obj)
test_lib = Lib()
@Reg
class A(object):
def __init__(self):
object.__init__(self)
self.name = "A instance"
@Reg
class B(object):
def __init__(self):
super(B, self).__init__()
self.name = "B instance"
>>> from testing import *
library created
object being added to library --> A
A instance
object being added to library --> B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "testing.py", line 25, in <module>
class B(object):
File "testing.py", line 14, in Reg
test_lib.add_obj(obj)
File "testing.py", line 8, in add_obj
inst = obj()
File "testing.py", line 27, in __init__
super(B, self).__init__()
NameError: global name 'B' is not defined
inst = obj()
print inst.name