【python37--面向对象】

一、 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)
原文地址:https://www.cnblogs.com/frankruby/p/9538137.html