Task07
类与对象
练习题
1、以下类定义中哪些是类属性,哪些是实例属性?
class C:
num = 0
def __init__(self):
self.x = 4
self.y = 5
C.count = 6
num=0为类属性,x=4和y=5,count为实例属性
2、怎么定义私有⽅法?
在该方法前加__(两个下划线)
3、尝试执行以下代码,并解释错误原因:
class C:
def myFun(self):
print('Hello!')
c = C()
c.myFun()
原因:它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self
。在调用方法时,我们无需明确提供与参数 self
相对应的参数。同时最后两行没有缩进
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
要求:
- 平日票价100元
- 周末票价为平日的120%
- 儿童票半价
class Ticket():
def __init__(self,p,t):
self.people=p
self.time=t
def getPrice(self):
if self.people=='adult':
dailyPrice=100
weekPrice=dailyPrice*1.2
else:
dailyPrice=100*0.5
weekPrice=dailyPrice*1.2*0.5
if self.time=='daily':
return dailyPrice
else:
return weekPrice
adult=Ticket('adult','daily')
child=Ticket('child','daily')
print(adult.getPrice()*2+child.getPrice())
魔法方法
练习题
1、上面提到了许多魔法方法,如__new__
,__init__
, __str__
,__rstr__
,__getitem__
,__setitem__
等等,请总结它们各自的使用方法。
__new__
决定是否要使用该__init__
方法,因为__new__
可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果__new__
没有返回实例对象,则__init__
不会被调用。__init__
当一个实例被创建的时候调用的初始化方法。__str__
在打印对象,用%s格式化以及强制转换数据类型时触发。__rstr__
在没有实现__str__
以及使用%r格式化的时候 触发。__getitem__
定义获取容器中元素的行为,相当于self[key]。__setitem__
定义设置容器中指定元素的行为,相当于self[key] = value。
2、利用python做一个简单的定时器类
要求:
- 定制一个计时器的类。
start
和stop
方法代表启动计时和停止计时。- 假设计时器对象
t1
,print(t1)
和直接调用t1
均显示结果。 - 当计时器未启动或已经停止计时时,调用
stop
方法会给予温馨的提示。 - 两个计时器对象可以进行相加:
t1+t2
。 - 只能使用提供的有限资源完成。
import time
class Clock():
def __init__(self):
self.info = '未开始计时'
self.start_time = None
self.sec = None
def __str__(self):
return self.info
def __repr__(self):
return self.info
def __add__(self, other):
return '共计时 %f s' %(self.sec+other.sec)
def start(self):
print('开始计时')
self.start_time=time.time()
self.info='正在计时'
def stop(self):
try:
self.sec=time.time()-self.start_time
except:
print('未开始或者计时已结束')
else:
print('停止计时')
self.info='已计时:%f s' %self.sec
t1 = Clock()
t1.stop()
t1.start()
time.sleep(5)
t1.stop()
print(t1)
t2 = Clock()
t2.start()
time.sleep(5)
t2.stop()
print(t1+t2)