Python unittest中@property与方法调用的四种场景差异解析求助
Yahtzee TDD测试:@property与调用方式的场景解析
场景原理与差异解析
1. 带@property,调用Roll(...).up_best
- 运行逻辑:
@property装饰器将up_best方法转为类属性,访问该属性时会自动执行方法并返回其结果(比如Type.SIXES枚举值)。 - 结果:方法内的
print('Found me')执行输出,返回值与测试断言的预期枚举值匹配,测试通过。
2. 无@property,调用Roll(...).up_best
- 运行逻辑:没有
@property时,up_best是普通实例方法,直接访问得到的是方法对象本身(格式如<bound method Roll.up_best of <Roll object at ...>>),而非方法返回值。 - 结果:测试断言的是枚举值
Type.SIXES,但实际拿到的是方法对象,类型与值均不匹配,触发AssertionError。
3. 带@property,调用Roll(...).up_best()
- 运行逻辑:
@property将up_best转为属性后,访问up_best得到的是方法返回的枚举实例,此时加()试图调用该枚举实例,但枚举对象不可被调用。 - 结果:方法本身会执行(输出
Found me),但后续调用枚举实例时触发TypeError: 'Type' object is not callable,测试失败。
4. 无@property,调用Roll(...).up_best()
- 运行逻辑:没有
@property时,up_best是普通方法,加()会执行方法并返回其结果(枚举值)。 - 结果:方法执行输出
Found me,返回的枚举值与测试断言的预期一致,测试通过。
测试文件对up_best的要求确认
从场景结果可直接推导:
- 若测试文件中调用的是
Roll(...).up_best(无括号),则要求up_best必须是@property装饰的属性; - 若测试文件中调用的是
Roll(...).up_best()(带括号),则要求up_best是普通方法。
内容的提问来源于stack exchange,提问作者highbandwidth
相关产品推荐
相关产品推荐

