ch7 面向对象程序设计-单元测试 (第1关:ch7 面向对象程序设计-单元测试-基础 + 第2关:ch7 面向对象程序设计-单元测试-提高 第3关:ch7 面向对象程序设计-单元测试-进阶 )

目录

第1关:ch7 面向对象程序设计-单元测试-基础

第2关:ch7 面向对象程序设计-单元测试-提高 

第3关:ch7 面向对象程序设计-单元测试-进阶 


第1关:ch7 面向对象程序设计-单元测试-基础

第2关:ch7 面向对象程序设计-单元测试-提高 

第3关:ch7 面向对象程序设计-单元测试-进阶 

第一题:
定义了一个名为Register的类,该类包含了一个构造函数__init__和三个方法get_age_value、get_name_value、get_sex_value以及一个析构函数__del__。
在main函数中,创建了一个名为wang的Register对象,并传入了3个关键字参数:age、name、sex。
将wang对象赋值给变量WANG。
执行del wang语句,删除wang对象,此时会调用Register类的析构函数__del__。
main函数执行结束。
代码执行结果:
调用了一次析构函数
解释:在执行del wang语句时,会调用wang对象的析构函数__del__,输出一条调用了一次析构函数的信息。

第二题:
21

输入21后,将21赋值给ee对象的age属性,由于21大于18,所以不会抛出异常,ee对象的age属性被赋值为21。然后在if语句中判断ee.age,由于ee.age有值,所以if语句返回True,并且打印出ee.age的值21。
需要注意的是,由于代码中使用了@property和@age.setter装饰器,所以实际访问和修改ee对象的age属性时,应该使用ee.age而不是ee.__age。这是因为使用@property装饰器后,类的属性被封装成了私有属性,只能通过类的方法来访问和修改。

第三题:
不能雇用童工
ValueError: invalid age
输入12后,将12赋值给ee对象的age属性,由于12小于18且大于0,所以会打印出“不能雇用童工”的提示,并且抛出ValueError异常,提示输入的年龄是无效的。因此,程序执行结束,不会打印出任何结果。

第四题:
该程序定义了一个ReprMixin类和一个MappingMixin类,分别实现了__repr__方法和__getitem__、__setitem__方法,这些方法可以被子类继承和调用。

程序还定义了一个Teacher类和一个Student类,分别继承了ReprMixin类和MappingMixin类,并在初始化方法中分别定义了一些属性。在程序最后,创建了一个Teacher对象t和一个Student对象s,并将它们作为参数传给print函数。

由于Teacher类继承了ReprMixin类并实现了__repr__方法,因此在print函数中输出t对象的时候,会调用__repr__方法将t对象的属性以字符串的形式返回,输出结果为:[教师甲, female, 48]。

而Student类继承了MappingMixin类并实现了__getitem__方法,因此在print函数中输出s对象的时候,会调用__getitem__方法将s对象的属性以字典的形式返回,输出结果为:{‘name’: ‘学生甲’, ‘gender’: ‘male’, ‘age’: ‘18’, ‘num’: 20180019}。

因此,最终的输出结果为:[教师甲, female, 48] {‘name’: ‘学生甲’, ‘gender’: ‘male’, ‘age’: ‘18’, ‘num’: 20180019}。

第五题:
这段代码定义了一个名为NumberSequence的类,该类实现了一个数列生成器,每次生成的数都是上一个数加上一个步长。具体来说,该类的构造函数接受三个参数:初始值init、步长step和最大值max(默认为100)。该类实现了__iter__和__next__方法,使其可以像迭代器一样被for-in循环使用。

在testNumberSequence函数中,首先创建了一个NumberSequence对象numSeq,初始值为0,步长为5,最大值为20。然后使用for-in循环对numSeq进行迭代,每次迭代都会调用__next__方法生成一个新的数,并将其打印出来。因为最大值为20,所以当数列生成器生成的数大于等于20时,会抛出StopIteration异常,for-in循环会自动捕获该异常并结束迭代。最终输出的结果是0 5 10 15。
定义一个名为NumberSequence的类
class NumberSequence:
# 类的构造函数,接受三个参数:初始值init、步长step和最大值max(默认为100)
def init(self, init, step, max = 100):
# 将初始值赋值给实例变量__data
self.__data = init
# 将步长赋值给实例变量__step
self.__step = step
# 将最大值赋值给实例变量__max
self.__max = max
# 实现__iter__方法,返回实例本身
def iter(self):
return self
# 实现__next__方法,每次生成一个数并返回,直到生成的数大于等于最大值,抛出StopIteration异常
def next(self):
if(self.__data < self.__max):
tmp = self.__data
self.__data += self.__step
return tmp
else:
raise StopIteration

testNumberSequence函数,用于测试NumberSequence类
def testNumberSequence():
# 创建一个NumberSequence对象,初始值为0,步长为5,最大值为20
numSeq = NumberSequence(0, 5, 20)
# 使用for-in循环对numSeq进行迭代,每次迭代都将生成的数打印出来
for n in numSeq:
print(n, end=’ ')

调用testNumberSequence函数,开始测试
testNumberSequence()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值