(标答出处: 鱼C论坛)
《零基础入门学习Python》
测试题:
答:体现了面向对象的多态性的特征
答:使用类的继承,用一个新类继承这个旧类,然后进行少量的修改就行了
答:绑定方法,有了这个参数,python再也不会分不清楚是哪个对象在调用方法,可以认为方法中的self就是实例对象的唯一标志
答:使用创建类的私有成员,具体方法是,在属性或方法前加上两个下划线‘__’,如需调用可以在类中写一个函数来获取,或者使用’_类名__属性名’ 来引用,例:
答:_init__方法会在类实例化时自动调用,成为魔法方法,可以重写方法,为对象指定初始方案
答:类、类对象、实例对象十三个不同的名词。
我们常说的类指的是类定义,由于“python无处不对象”,所以当类定义完之后,自然就是类对象。这个时候可 以对类的属性(变量)进行直接访问(MyClass.name)。
一个类可以实例化出无数的实例对象,python为了区分到底是哪个实例对象调用了方法,所以必须要求方案要绑定(通过self参数)对象才能调用,而为实例化的类对象直接调用方法,因为缺少self参数,就会报错。
class calctickets() :
def __init__ (self ,weekend = False , child = False) :
self.price = 100
if weekend == True :
self.inc = 1.2
else :
self.inc = 1
if child == True :
self.discount = 0.5
else :
self.discount = 1
def calcprice (self ,num) :
return self.price * self.inc *self.discount * num
adult = calctickets()
child = calctickets(child=True)
weekend_adult = calctickets(weekend=True)
weekend_child = calctickets(weekend=True,child=True)
print ("2个成人 + 1个小孩周末票价:%.2f " %(weekend_adult.calcprice(2) + weekend_child.calcprice(1)) )
print ("2个成人 + 1个小孩平日票价:%.2f " %(adult.calcprice(2) + child.calcprice(1)) )
运行结果:
import random as r
legal_x = [0,10]
legal_y = [0,10]
class Turtle :
def __init__ (self) :
#初始体力
self.life = 100
#初始位置随机
self.x = r.randint(legal_x[0],legal_x[1])
self.y = r.randint(legal_y[0],legal_y[1])
def move (self) :
#随机计算方向并移动到新位置(x,y)
new_x = self.x + r.choice([1,2,-1,-2])
new_y = self.y + r.choice([1,2,-1,-2])
#检查是否超出x和y边界,超出向反方向移动
if new_x < legal_x[0] :
self.x = legal_x[0] - (new_x -legal_x[0])
elif new_x > legal_x[1] :
self.x = legal_x[1] - (new_x - legal_x[1])
else :
self.x = new_x
if new_y < legal_y[0] :
self.y = legal_y[0] - (new_y - legal_y[0])
elif new_y > legal_y[1] :
self.y = legal_y[0] - (new_y - legal_y[1])
else :
self.y = new_y
#体力减少
self.life = self.life - 1
#返回新位置
return (self.x , self.y)
def eat (self) :
#吃鱼体力恢复20
self.life = self.life + 20
#上限为100
if self.life > 100 :
self.life = 100
class Fish :
def __init__ (self) :
#类似于龟的初始位置随机
self.x = r.randint (legal_x[0],legal_x[1])
self.y = r.randint (legal_x[0],legal_y[1])
def move (self):
#随机方向移动
new_x = self.x + r.choice([1,2,-1,-2])
new_y = self.y + r.choice([1,2,-1,-2])
#判断鱼的x,y坐标是否超出边界
if new_x < legal_x[0] :
self.x = legal_x[0] - (new_x - legal_x[0])
elif new_x > legal_x[1] :
self.x = legal_x[1] - (new_x - legal_x[1])
else :
self.x = new_x
if new_y < legal_y[0] :
self.y = legal_y[0] - (new_y - legal_y[0])
elif new_y > legal_x[1] :
self.y = legal_y[1] - (new_y - legal_y[1])
else :
self.y = new_y
#返回新的位置
return (self.x , self.y)
turtle = Turtle ()
fish = []
for i in range (10) :
new_fish = Fish()
fish.append(new_fish)
while True :
if len(fish) == 0 :
print ("鱼被吃光啦^_^!\n游戏结束……")
break
if turtle.life == 0: #if
print ("龟体力耗尽了啦T_T!\n游戏结束……")
break
position=turtle.move()
for each_fish in fish[:] :
if each_fish.move()==position:
#鱼儿被吃掉
turtle.eat()
fish.remove(each_fish)
print("有一条鱼被吃了……")
运行结果: