练习题
(一)类与对象
1、以下类定义中哪些是类属性,哪些是实例属性?
class C:
num = 0 #类属性
def __init__(self):
self.x = 4 #实例属性
self.y = 5 #实例属性
C.count = 6
2、怎么定义私有⽅法?
在Python中定义私有变量只需在变量名或函数名前加“_”即可。
3、尝试执行以下代码,并解释错误原因:
class C:
def myFun():
print('Hello!')
c = C()
c.myFun()
错误原因:myFun()的括号里没有写“self”。
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
要求:
平日票价100元
周末票价为平日的120%
儿童票半价
class ticket:
def _init_(self,p=100,tp=0):
self.price=p
self.totalprice=tp
def cost(self):
day=int(input("which ticket do you want?"))
adult=int(input("how much adult tickets do you want?"))
child=int(input("how much children tickets do you want?"))
if day in range(1,6):
self.totalprice=adult*self.price+child*self.price*0.5
print("the total price is:self.totalprice")
elif day in range(6,8):
self.totalprice=adult*self.price*1.2+child*self.price*1.2
print("the total price is:self.totalprice")
m=ticket()
m.cost()
(二)魔法方法
1、上面提到了许多魔法方法,如__new__,init, str,rstr,getitem,__setitem__等等,请总结它们各自的使用方法。
new(cls[, …]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。
- new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init。
- new__对当前类进行了实例化,并将实例返回,传给__init__的self。但是,执行了__new,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行,将没有__init__被调用。
__new__方法主要是当你继承一些不可变的 class 时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
str(self) 的返回结果可读性强。也就是说,str 的意义是得到便于人们阅读的信息,
repr(self) 的返回结果应更准确。怎么说,repr 存在的目的在于调试,便于开发者使用。
2、利用python做一个简单的定时器类
要求:
定制一个计时器的类。
start和stop方法代表启动计时和停止计时。
假设计时器对象t1,print(t1)和直接调用t1均显示结果。
当计时器未启动或已经停止计时时,调用stop方法会给予温馨的提示。
两个计时器对象可以进行相加:t1+t2。
只能使用提供的有限资源完成。
import time
class timer():
def _init_(self):
print()
self.info="no start"
self.begin=None
self.end=None
self.time=0
def _str_(self):
return self.info
def start(self):
print("begin")
self.begin=time.localtime()
def stop(self):
if not self.begin:
print("please call start() first!")
return
self.end=time.localtime
self.time=time.mktime(self.end)-time.mktime(self.begin)
self.info="run %d seconds" % self.time
print("it is over!")
self.begin=None
return self.time
def show(self):
print(self info)
def _add_(self,other):
teturn 'run %d seconds' % (other.time + self.time)
t1=timer()
print(t1)
t1.show()
t1.stop()
t1.start()
time.sleep(1)
t1.stop()
print(t1)
t1.stop()
t2=timer()
print(t2)
t2.start()
time.sleep(3)
t2.stop()
print(t2)
print(t1+t2)