如何在 Python 的装饰器中访问 class 属性?

How to access class property in decorator in Python?

我正在尝试使用 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。有解决方法吗?我知道我可以使用全局 class 变量,但我需要在 setUp.

中使用变量

装饰器不是 运行,但您似乎认为它是 运行。在以下示例中:

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

记住装饰器的使用等同于说:

beans = eggs( beans )

spam 范围内,def 语句本身执行后立即 def 语句何时执行?当时定义了 class 及其方法。装饰器修改方法 spam.beans 的 class 级定义,而不是 self.beans 的实例级值。当然,这发生在 class 的任何 实例 被创建之前很久,即在对任何一个特定实例的引用之前,self 是有意义的.

如果您想将特定的可调用对象(例如,使用 functools.partial 将某些参数预烘焙到其中的修改后的 test_param 可调用对象)附加到实例 self,您可以当然这样做 inside 实例方法之一(例如 __init__setUp)。

有些人会描述 class 定义代码发生在 "parse time" 和实例级代码发生在 "run time"。您可能会或可能不会发现这是一种有用的思考方式,尽管实际上几乎所有内容都是 Python.

中的 "run-time"

一种解决方法是在装饰器中使用包含属性名称的字符串,并在测试函数中使用 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.

检查