Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.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 测试生成器方法性能_Python_Generator_Nosetests - Fatal编程技术网

Python 测试生成器方法性能

Python 测试生成器方法性能,python,generator,nosetests,Python,Generator,Nosetests,我试图编写一个包含生成器的测试类,并使用nosetests运行测试。但是,nosetests测试运行程序似乎隔离了测试类中的方法,因此它们不共享相同的self,这让我感到困惑: class Test(object): def check(self): print self.one def test(self): self.one = 1 yield self.check 这给了我以下错误: AttributeError: 'T

我试图编写一个包含生成器的测试类,并使用
nosetests
运行测试。但是,
nosetests
测试运行程序似乎隔离了测试类中的方法,因此它们不共享相同的
self
,这让我感到困惑:

class Test(object):

    def check(self):
        print self.one

    def test(self):
        self.one = 1
        yield self.check
这给了我以下错误:

AttributeError: 'Test' object has no attribute 'one'
我猜这与鼻子有关,某种程度上,把测试彼此隔离开来。除了将所有必需的变量显式地传递给方法而不是隐式地作为
self
上的属性传递给方法之外,还有其他解决方法吗

为了清楚起见,我知道如何在“标准”Python中分配属性。这不是我要问的。我想知道的是如何使用
nosetests
命令在
nosetests
测试运行中实现所需的行为


根据建议,我可以添加一个
\uuuu init\uuu
方法来初始化属性。这是一个解决办法,但它确实回答了我最初提出的问题

但是,我最终想要做的是在yield语句上循环,修改
self
上的属性值,并在
check
方法中的
self
值中注册修改寄存器。添加一个
\uuuu init\uuuu
不允许我这样做

class Test(object):

    def __init__(self):
        self.one = None

    def check(self):
        print self.one

    def test(self):
        self.one = 1
        yield self.check
我得到:

$ nosetests nosetest-with-classes.py --nocapture
None
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

nosetests运行程序似乎仍在实施某种方法级隔离。所以我想再深入一点了解一下发生了什么。是否有办法以正常方式共享
self
变量的属性?

简单的回答是否,您不能使用类的实例变量传递状态。在达到类方法的收益率时,nose将始终确定该方法属于哪个类,并将创建该类的新实例,该实例将不具有您倾向于在当前测试生成类实例上设置的属性(请参阅)。一种解决方案可能是使用类变量来传递所需的信息,如下所示:

class Test(object):
    def check(self):
        print self.one # here it really refers to Test.one

    def test(self):
        Test.one = 1
        yield self.check

但我建议您研究一下,它确实实现了您在这里试图实现的一些魔力。

您可以包括
\uuuu init\uuuu
方法,并使用
one
作为参数初始化您的实例。