zoukankan      html  css  js  c++  java
  • 【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)
  • 相关阅读:
    面向对象设计原则之接口隔离原则
    面向对象设计原则之开闭原则
    [OOD]违反里氏替换原则的解决方案
    错误程序
    error: ‘for’ loop initial declarations are only allowed in C99 mode
    函数模板
    查找
    队列类模板
    栈类模板
    单链表的结点类模板
  • 原文地址:https://www.cnblogs.com/frankruby/p/9538137.html
Copyright © 2011-2022 走看看