如何在Python中访问decorator中的类属性?

时间:2015-12-11 17:49:07

标签: python nose nosetests parameterized-unit-test nose-parameterized

我正在尝试使用let ca = Color(1.,1.,1.) let cb = ca ca = cb 测试,并希望将其用于unittest方法。

nose_parameterized

但是from nose.tools import assert_equal from nose_parameterized import parameterized import unittest Class TestFoo(unittest.TestCase): def setUp(self): self.user1 = "Bar" self.user2 = "Foo" @parameterized.expand([ ("testuser1",self.user1,"Bar"), ("testuser2",self.user2,"Foo") ] def test_param(self,name,input,expected): assert_equal(input,expected) 没有在装饰器函数中定义。这有解决方法吗?我知道我可以使用全局类变量,但我需要在self中使用变量。

2 个答案:

答案 0 :(得分:4)

一种解决方法是在装饰器中使用包含属性名称的字符串,并在测试函数中使用getattr

@parameterized.expand([
           ("testuser1", "user1", "Bar"),
           ("testuser2", "user2", "Foo")
            ])
def test_param(self, name, input, expected):
    assert_equal(getattr(self, input), expected)

使用此方法,test_param假定其input参数的值是属性名称,其值应根据expected进行检查。

答案 1 :(得分:2)

当您假设它将被运行时,装饰器不会运行。在以下示例中:

class spam:
    @eggs
    def beans( self ):
        pass

请记住,装饰器的使用与说法相同:

beans = eggs( beans )
spam范围内

紧接def语句本身执行后。何时执行def语句?在定义类及其方法时。装饰器修改方法spam.beans的类级定义,而不是self.beans的实例级值。当然,这种情况早在创建该类的任何实例之前就已经发生,即在对任何一个特定实例self的引用有意义之前。

如果要将特定的可调用对象(例如,使用functools.partial预先烘焙了某些参数的已修改test_param可调用对象)附加到实例self,您当然可以在里面实例方法之一(例如__init__setUp)。

有些人会将类定义代码描述为“解析时”,而实例级代码则发生在“运行时”。您可能会或可能不会找到一种有用的思考方式,尽管几乎所有内容都是Python中的“运行时”。