Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python decorator内部带有super()的NameError_Python_Python 2.7_Super_Python Decorators - Fatal编程技术网

Python decorator内部带有super()的NameError

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

使用Python2.7

我正在使用decorators在导入时创建一个对象库,并且在导入时对每个对象的实例进行一些检查;主要是重复检查

我最近切换到使用
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