如何在 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
.
检查
我正在尝试使用 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
.