python中函数type可以测试对象的类型_Python unittest 模块关于对象的类属性和实例属性的异常现象...

在编写模块的过程中,我写到以下类和方法(这里用 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]

再次运行上述测试时候,发现可以通过。

这两种方式为什么会有差别,这里面还有其他坑没有?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值