在编写模块的过程中,我写到以下类和方法(这里用 A,B 抽象表示):
class A:
pass
class B:
prop_list = [None]
def __init__(self):
self.a = A()
self.prop_list[0] = self.a
作用就是类 B 的属性 a 是 A 的一个实例,而 B.prop_list 中包含这个实例。
然后写单元测试的时候,写了如下测试(简化模型):
import unittest
class TestFirst(unittest.TestCase):
b = B()
assert b.prop_list[0] is b.a
def test_func1(self):
assert self.b.prop_list[0] is self.b.a
unittest.main()
作用就是判断 B 的实例 b 中的属性 a 就是它 prop_list 中的 a,测试通过
但是当我添加一个一模一样的测试时候:
import unittest
class TestFirst(unittest.TestCase):
b = B()
assert b.prop_list[0] is b.a
def test_func1(self):
# !!! AssertionError
assert self.b.prop_list[0] is self.b.a
class TestSecond(unittest.TestCase):
b = B()
assert b.prop_list[0] is b.a
def test_func1(self):
assert self.b.prop_list[0] is self.b.a
unittest.main()
却发现 AssertionError !
我尝试利用 print 函数把每个属性打印出来:
class TestFirst(unittest.TestCase):
b = B()
print('test_1:')
print(b.a)
print(b.prop_list[0])
# assert b.prop_list[0] is b.a
def test_func1(self):
print('func1:')
print(self.b.a)
print(self.b.prop_list[0])
# assert self.b.prop_list[0] is self.b.a
class TestSecond(unittest.TestCase):
b = B()
print('test_2:')
print(b.a)
print(b.prop_list[0])
# assert b.prop_list[0] is b.a
def test_func2(self):
print('func2')
print(self.b.a)
print(self.b.prop_list[0])
# assert self.b.prop_list[0] is self.b.a
得到以下结果:
test_1:
test_2:
func1:
<__main__.a object at> // 这里居然不是 0x000001F07CD7D7F0
.func2
.
----------------------------------------------------------------------
Ran 2 tests in 0.002s
为什么 TestFirst 实例方法 test_func1 中 self.b.prop_list[0] 和自己的 self.b.a 不是同一个对象,而和 TestSecond 实例方法 test_func2 中的 self.b.prop_list[0] 一样呢?
另外,如果我把 class B 的 prop_list 当作实例属性,在初始化函数 __init__() 中声明:
class A:
pass
class B:
def __init__(self):
self.a = A()
self.prop_list= [self.a]
再次运行上述测试时候,发现可以通过。
这两种方式为什么会有差别,这里面还有其他坑没有?