全民一起玩Python提高篇第十一课:面向对象基本原理与语法(二)

封装

先安装一个pygame的包

做一个赛猫游戏
主程序

import pygame
import time
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
img_cat=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png')
#读入背景和猫的图片
screen.blit(img_bg,(0,0))
#确定画的图和画的坐标
pygame.display.update()
#全部画好了再刷新,而不能每画一个就刷新
i=0
while i<800:
    screen.blit(img_bg,(0,0))
    #重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
    screen.blit(img_cat,(i,200))
    pygame.display.update()
    i+=100
    time.sleep(0.5)
    pygame.time.delay(200)
    #自带的延时功能
pygame.quit()

类程序

import random
import pygame
class cat:
    def __init__(self,n,s,img_file,y):
        self.name=n
        self.speed=s
        self.__image=py.game.image.load(img_file)

    def run(self,scr):
        self.__x+=round(self.speed*random.random())

迭代了下一个版本
主函数

import pygame
import time
from cat_class import cat
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
#读入背景和猫的图片
c_list=[cat('锦到黑',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200),
            cat('我很帅',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_green.png',300),
            cat('黑得很', 5, r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_purple.png', 400)]
#把各个对象建立成一个列表
while True:
    screen.blit(img_bg,(0,0))
    #重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
    # 确定画的图和画的坐标
    for c in c_list:
        screen.blit(c.get_image(), c.get_loc())
        c.run()
    pygame.display.update()
    pygame.time.delay(200)
    #自带的延时功能
pygame.quit()

类函数

import random
import pygame
class cat:
    def __init__(self,n,s,img_file,y):
        self.name=n
        self.speed=s
        self.__image=pygame.image.load(img_file)
        self.__y=y
        self.__x=0
    def run(self):
        self.__x+=round(self.speed*random.random())

    def get_image(self):
        return self.__image

    def get_loc(self):
        return(self.__x,self.__y)

多态

主程序

import pygame
import time
from cat_class import cat
from dancer_class import dancer
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
#读入背景和猫的图片
c_list=[cat('锦到黑',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200),
            cat('我很帅',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_green.png',300),
            cat('黑得很', 5, r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_purple.png', 400),
            dancer(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200,500)]
#dancer也放入这个列表,扫描的时候能够扫描出来
while True:
    screen.blit(img_bg,(0,0))
    #重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
    # 确定画的图和画的坐标
    for c in c_list:
        screen.blit(c.get_image(), c.get_loc())
        c.run()
        #两类对象,但是拥有相同的方法,就可以一起调用
        #只看能力不看出身,代码复用率高
        #python中讨论多态,不需要父类和子类的继承关系
    pygame.display.update()
    pygame.time.delay(50)
    #自带的延时功能
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()

类程序

import random
import pygame
class dancer:
    def __init__(self,  img_file, x,y):
        self.__image = pygame.image.load(img_file)
        self.__y = y
        self.__x = x

    def run(self):
        self.__y+=random.randint(-10,10)
            #上下摆动

    def get_image(self):
        return self.__image

    def get_loc(self):
        return (self.__x, self.__y)
import random
import pygame
class cat:
    def __init__(self,n,s,img_file,y):
        self.name=n
        self.speed=s
        self.__image=pygame.image.load(img_file)
        self.__y=y
        self.__x=0
    def run(self):
        self.__x+=round(self.speed*random.random())

    def get_image(self):
        return self.__image

    def get_loc(self):
        return(self.__x,self.__y)

题目:多态基本练习

在国际学校中同一个班级中拥有不同国籍的学生,请你分别定义中国人类Chinese、英国人类English和日本人类Japanese。
每个学生类都有一个speak方法进行发言,当中国人发言时,打印“我是中国同学,使用中文发言”,其他学生也是类似的。
定义一个函数 ask ,该函数接收一个对象作为参数,并调用该对象的 speak 方法让其发言。然后在主程序中,先创建若干个不同国籍学生的对象,再反复调用函数ask,每次传递给它一个不同的学生对象,观察结果。

主程序

from 学生类 import Chinese
from 学生类 import Japanese
from 学生类 import English

def ask(stu):
    stu.speak()

if __name__=='__main__':
    stu1=Chinese()
    stu2=Japanese()
    stu3=English()
    ask(stu1)
    ask(stu2)
    ask(stu3)

学生类

class   Chinese:
    def speak(self):
        print('我是中国同学,我用中文发言')

class   Japanese:
    def speak(self):
        print('我是日本同学,但我用中文发言')

class English:
    def speak(self):
        print('I am English student, so I speak in English')

定义圆形,长方形和正方形三个类,圆类在init时会自动添加一个属性 r,代表半径;长方形会添加 a 和 b 两个属性,代表其长和宽;正方形会添加一个属性 a,代表其边长。
然后给每个类都编写两个用于计算自己周长和面积的方法 get_perimeter 和 get_area。
接下来定义一个函数tools,只要传给他一个图形对象(即圆、长方形、或正方形),它就可以调用该对象的方法,计算并输出对应的周长和面积。
请在主程序中创建若干个这些图形类的对象,然后分别把它们交给函数 tools,观测结果。

主程序

from 几何图形类 import circle
from 几何图形类 import square
from 几何图形类   import rectangle

def tools(shape):
    print(type(shape),'周长是:',round(shape.get_perimeter()))
    print(type(shape),'面积是:',round(shape.get_area()))

if __name__=='__main__':
    s1=circle(5)
    s2=square(3)
    s3=rectangle(4,3)
    tools(s1)
    tools(s2)
    tools(s3)

类定义

class circle:
    def __init__(self,radius):
        self.__r=radius
    def get_perimeter(self):
        return 3.14*self.__r*2

    def get_area(self):
        return 3.14 * self.__r*self.__r

class square:
    def __init__(self,length):
        self.__a=length
    def get_perimeter(self):
        return 4*self.__a

    def get_area(self):
        return self.__a^2

class rectangle:
    def __init__(self,length,width):
        self.__a=length
        self.__b=width

    def get_perimeter(self):
        return 2*(self.__a+self.__b)

    def get_area(self):
        return self.__a*self.__b


某代工厂生产两种电脑。笔记本电脑的信息有:品牌、cpu、内存大小、硬盘大小等;台式机电脑的信息有:品牌、cpu、内存大小、硬盘大小、耗电功率等。
要求:请定义两个类,分别代表笔记本和台式机两种电脑,并包含其各自的全部信息。接下来在主程序中创建3台笔记本电脑和2台台式机电脑,然后放入一个列表中,并使用一个循环即可打印所有电脑的信息。请使用鸭子模型的思想实现该任务。

主程序

from 电脑类定义 import laptop
from 电脑类定义 import computer

computers=[laptop('联想','IBM','32G','2048G'),
                    laptop('华硕','Intel','16G','2048G'),
                    laptop('戴尔','Intel','8G','1024G'),
                    computer('外星人','IBM','32G','2048G','100KW'),
                    computer('外星人','IBM','64G','2048G','100KW')]
#存放信息
for c in computers:
        c.print_info()

类定义

class laptop():
    def __init__(self,brand,cpu,memory,disk):
         self.__b=brand
         self.__c=cpu
         self.__m=memory
         self.__d=disk

    def print_info(self):
        print(self.__b,self.__c,self.__m,self.__d)

class computer():
    def __init__(self,brand,cpu,memory,disk,power):
         self.__b=brand
         self.__c=cpu
         self.__m=memory
         self.__d=disk
         self.__p=power
    def print_info(self):
        print(self.__b,self.__c,self.__m,self.__d,self.__p)

简单游戏

游戏中的玩家类的属性有:血量、攻击力、防御力;敌人类的属性有:血量、攻击力、防御力。
玩家和敌人都有攻击方法attack和防御方法defense。
当玩家攻击时显示玩家的攻击力信息,当敌人攻击时显示敌人的攻击力信息。
当玩家防御时显示玩家的防御力信息, 当敌人防御时显示敌人的防御力信息。
使用Game类的play方法控制玩家攻击,敌人进行防御。
玩家攻击1次,另外两个敌人分别防御1次,总共三轮攻击。

主程序

from 游戏对象 import player
from 游戏对象 import enemy
from 游戏对象 import game

obj_list = [   player(1000, 500, 300),
                    enemy(800, 300, 200),
                    enemy(800, 300, 200)]

game = game()
for i in range(3):
#执行三次
    game.attack(obj_list[0])
    game.defend(obj_list[1])
    game.defend(obj_list[2])

类定义

class player:
    def __init__(self,blood,attack,defend):
        self.__b=blood
        self.__a=attack
        self.__d=defend

    def attack(self):
        print(self.__a)

    def defense(self):
        print(self.__d)

class enemy:
    def __init__(self,blood,attack,defend):
        self.__b=blood
        self.__a=attack
        self.__d=defend

    def attack(self):
        print(self.__a)

    def defense(self):
        print(self.__d)

class game:
    def attack(self,obj):
        obj.attack()

    def defend(self, obj):
        obj.defense()

创建狮子类和羊类,狮子拥有eat和run方法,分别打印吃喝跑的信息;羊拥有eat和play方法,分别打印吃喝玩的信息。
创建饲养员类,饲养员可以给狮子和羊喂食,判断传入对象的类型,执行跑或者玩的行为。

主程序

from animal_class import Monkey
from animal_class import Lion
from animal_class import Feeder

feeder=Feeder()
animals=[Monkey(),Monkey(),Lion(),Monkey()]
#for a in animals:
#    b=type(a)
  #  print(type(a))
#判断好数据类型
for a in animals:
    feeder.Feed(a)

类定义

class Lion():
    def Eat(self):
        print('狮子吃东西')
    def Run(self):
        print('狮子跑')
class Monkey():
    def Eat(self):
        print('猴子吃东西')
    def Play(self):
        print('猴子玩')

class  Feeder():
    def Feed(self,animal):
        animal.Eat()
        if type(animal) is Lion:
            #判断类型用is
            animal.Run()
        elif type(animal) is Monkey:
            animal.Play()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值