使用pytest检测Python类实例属性时hasattr返回False,求解决方案
问题分析与解决方法
你遇到的核心问题是混淆了类属性和实例属性的区别:
- 你的
Dog类里,self.name = name是在实例初始化时给每个Dog实例对象添加的属性,不是Dog类本身的属性 hasattr(Dog, 'name')是检查Dog这个类是否拥有name属性,自然会返回False
正确的测试写法
要验证实例属性是否存在,你需要先创建Dog类的实例,再对实例调用hasattr():
from utils.attribute_1 import Dog def test_Dog_instance_has_name_attribute(): # 先创建Dog类的实例 my_dog = Dog("旺财", "中华田园犬") # 检查实例是否有name属性 assert hasattr(my_dog, 'name')
更适合TDD教学的扩展测试
既然是给学生做Python语法专项测试,还可以补充验证属性值是否正确,让测试更完整:
from utils.attribute_1 import Dog def test_Dog_instance_attributes(): dog_name = "旺财" dog_breed = "中华田园犬" my_dog = Dog(dog_name, dog_breed) # 验证实例拥有name和breed属性 assert hasattr(my_dog, 'name') assert hasattr(my_dog, 'breed') # 验证属性值正确赋值 assert my_dog.name == dog_name assert my_dog.breed == dog_breed
额外说明(给学生的知识点)
如果要把name变成类属性(所有Dog实例共享的属性),写法是这样的:
class Dog: # 类属性,属于Dog类本身 name = "默认名字" def __init__(self, breed): self.breed = breed
这时hasattr(Dog, 'name')才会返回True,但这显然不是你当前代码的意图,你的代码是想给每个狗实例赋予独立的名字和品种。
内容的提问来源于stack exchange,提问作者KTheTechTeacher
相关产品推荐
相关产品推荐

