一、 self是什么
绑定方法,self就是实例对象的唯一标志
>>> class Ball: def setName(self,name): self.name = name def clik(self): print('我是%s'%self.name) >>> a = Ball() >>> a.setName('小A') >>> b = Ball() >>> b.setName('小B') >>> a.clik() 我是小A >>> b.clik() 我是小B ---- a = Ball() #实例对象 a.setName('小A') #通过self可以得知是a在调用这两个方法setName()和clik()
二、python的魔法方法
1、_init_(self):构造函数,类在实例化时被自动调用
_init_(self,param1,param2...)
>>> class Ball: def __init__(self,name): self.name = name def clik(self): print('我是%s' % self.name) >>> a = Ball('小A') >>> a.clik() 我是小A --------- 采用__init__()函数后,在实例化对象 a = Ball('小A')时直接可以赋值 而省去了第一个例子的a.setName('小A')
三、共有和私有
共有:对象的属性和方法就是共有的,可以采用'.方法'/'.属性'访问
私有:在python中定义私有变量只需要在变量名或者函数前加上两个下划线‘__’,那么这个函数或者变量名就变成了私有的了
>>> class Person: __name = '尘封' def getName(self): return self.__name >>> p = Person() >>> p.getName() '尘封' >>> p._Person__name '尘封' '''__name:私有化属性 |-- 两种调用私有化的方法 |-- 第一种定义方法getName(),p.getName() |--第二种:p._person__name (person只有一个下划线,name有两个下划线)
'''
四、类的继承(已经有了一个类,编写另外一个相似的类,就可以采用继承)
五、如果我们不希望属性或者方法被外部调用,就可以在属性或者方法前面加两个下划线,即:私有化属性,私有化方法(如果外部调用,则会报AttributeError错误)
>>> class Person:
__name = '尘封'
def getName(self):
return self.__name
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "<pyshell#39>", line 1, in <module>
p.__name
AttributeError: 'Person' object has no attribute '__name'
六、按照以下要求定义一个游乐园的类,计算两个成人+一个小孩平日票价
* 平日报价:100
* 周末票价为平日的120%
* 儿童半价
class Ticket: def __init__(self,weekend=False,child=False): self.exp = 100 if weekend: self.inc = 1.2 else: self.inc = 1 if child: self.discount = 0.5 else: self.discount = 1 def calcPice(self,num): return self.exp*self.inc*self.discount*num adult = Ticket() adult_weekend = Ticket(weekend=True) child = Ticket(child=True) print('2个成人+1个小孩平日的票价 %.2f'% (adult.calcPice(2) + child.calcPice(1))) print('2个成人+1个小孩假日的票价 %.2f'%(adult_weekend.calcPice(2)+child.calcPice(1)))
七、按以下要求定义一个乌龟类和鱼类并尝试编写游戏
--假定游戏场景范围为(x,y)为0<=x<=10,0<=y<=10
--游戏生成1只乌龟和10条鱼
--他们移动方向均随机
--乌龟的最大移动距离为2(它可以随机选择1还是2移动),鱼儿的最大移动距离为1
--当移动到场景边缘,自动像反方向移动,
--乌龟初始化体力为100(上限)
--乌龟每移动一次,体力消耗1
--当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
--鱼暂不计算体力
--当乌龟体力为0(挂掉) 或者鱼儿的数量为0游戏结束
import random as r
legal_x = [0,10]
legal_y = [0,10]
class Turtle:
def __init__(self):
#初始化体力,初始随机位置
self.power = 100
self.x = r.randint(legal_x[0],legal_x[1])
self.y = r.randint(legal_y[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边界
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
#判断是否超出了y边界
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[1] - (new_y - legal_y[1])
else:
self.y = new_y
self.power -= 1
return (self.x,self.y)
def eat(self):
self.power += 20
if self.power > 100:
self.power = 100
class Fish:
def __init__(self):
self.x = r.randint(legal_x[0],legal_x[1])
self.y = r.randint(legal_y[0],legal_y[1])
def move(self):
new_x = self.x + r.choice([1,-1])
new_y = self.y = r.choice([1,-1])
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[1] - (new_y - legal_y[1])
else:
self.y = new_y
return (self.x , self.y)
#开始乌龟吃鱼的游戏,生成一只乌龟,生成10条鱼
turtle = Turtle()
fish = []
for i in range(10):
new_fish = Fish()
fish.append(new_fish)
i =0
while True:
if turtle.power < 0:
print('乌龟体力耗尽,挂掉了!!!')
break
if len(fish) == 0:
print('鱼儿在被吃完,游戏结束!!!')
break
#游戏开始运行
pos = turtle.move()
for each_fish in fish[:]:
if each_fish.move() == pos:
turtle.eat()
fish.remove(each_fish)
print('鱼在(%d,%d)被吃掉一条...'%(pos[0],pos[1]))
i +=1
print('乌龟共走了%d步'%i)