7、类、对象与魔法方法

练习题

(一)类与对象
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)		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值