继承父类方法与直接调用父类方法有什么区别?

来源:3-7 飞机大战项目敌方飞机类的封装

qq_慕娘5109606

2019-06-04 21:51:18

http://img.mukewang.com/climg/5cf6773b00018d1608200542.jpg

游戏中的效果是一致的。

import random

import pygame, constants
from game.bullute import Bullet


class Plane(pygame.sprite.Sprite):
   """飞机基础类型"""
   # 飞机图片
   plane_images = []
   # 飞机爆炸图片
   destroy_images = []
   # 坠毁的音乐
   down_sound_src = None
   # 飞机状态 T or F
   active = True
   # 飞机发生子弹的子弹精灵组
   bullets = pygame.sprite.Group()
   # 背景图片

   def __init__(self, screen, speed=None):
       super().__init__()
       # 加载静态资源
       self._img_list = []
       self._destroy_img_list = []
       self.down_sound = None
       self.load_src()

       # 设置飞机飞行速度
       self.speed = speed or 10

       # 获取飞机位置
       self.screen = screen
       self.rect = self._img_list[0].get_rect()

       # 获取屏幕大小
       self.width, self.height = self.screen.get_size()
       # 获我方飞机高度宽度
       self.our_plan_width, self.our_plan_hight = self._img_list[0].get_size()

       # 改变飞机初始位置
       our_plan_width, our_plan_hight = self._img_list[0].get_size()
       self.rect.topleft = (int(self.width - our_plan_width) / 2,
                            int(self.height - our_plan_hight))



   def load_src(self):
       """加载静态资源"""
       # 飞机图像
       for img in self.plane_images:
           self._img_list.append(pygame.image.load(img))
       # 飞机坠毁的图像
       for img in self.destroy_images:
           self._destroy_img_list.append(pygame.image.load(img))
       # 坠毁音乐
       if self.down_sound_src:
           self.down_sound = pygame.mixer.Sound(self.down_sound_src)
       print(len(self._img_list))

   @property
   def image(self):
       # 设置飞机图片(列表形式)
       return self._img_list[0]

   def blit_me(self):
       # 绘制飞机。
       self.screen.blit(self.image, self.rect)

   def move_up(self):
       self.rect.top -= self.speed

# 设置飞机按键移动效果
   def move_down(self):
       self.rect.top += self.speed

   def move_left(self):
       self.rect.left -= self.speed

   def move_right(self):
       self.rect.left += self.speed

   def broken_down(self):
       # 播放坠音乐
       if self.down_sound:
           self.down_sound.play()
       # 坠毁图片播放
       for img in self._destroy_img_list:
           self.screen.blit(img, self.rect)
       # 坠毁后状态变成F
       self.active = False

   def shoot(self):
       """发射子弹"""
       bullet = Bullet(self.screen, self, 30)
       self.bullets.add(bullet)


class OurPlan(Plane):
   """我方飞机"""
   plane_images = constants.OUR_PLAN_IMG_LIST
   # 飞机爆炸图片
   destroy_images = constants.OUR_PLAN_DESTROY_IMG_LIST
   # 坠毁的音乐
   down_sound_src = constants.OUR_PLAN_DESTROY_MUSIC

   # 超出界面后拉回来
   def move_up(self):
       super().move_up()
       if self.rect.top <= 0:
           self.rect.top = 0

   def move_down(self):
       super().move_down()
       if self.rect.bottom >= self.height:
           self.rect.bottom = self.height

   def move_left(self):
       super().move_left()
       if self.rect.left <= 0:
           self.rect.left = 0

   def move_right(self):
       super().move_right()
       if self.rect.left >= self.width - self.our_plan_width:
           self.rect.left = self.width - self.our_plan_width

   def move(self, key_down):
       """设置飞机按键盘一直移动"""
       if key_down == None:
           pass
       elif key_down == pygame.K_w or key_down == pygame.K_UP:
           self.move_up()
       elif key_down == pygame.K_s or key_down == pygame.K_DOWN:
           self.move_down()
       elif key_down == pygame.K_a or key_down == pygame.K_LEFT:
           self.move_left()
       elif key_down == pygame.K_d or key_down == pygame.K_RIGHT:
           self.move_right()

   def update(self, frame, KEY_down):
       # self.move(KEY_down)  # 设置按一次键盘就一直保持运动

       # 设置飞机的动态喷雾效果
       if frame % 3 == 0:
           self.screen.blit(self._img_list[0], self.rect)
       else:
           self.screen.blit(self._img_list[-1], self.rect)

   def breakdown(self):
       # 绘制飞机坠毁图像
       self.screen.blit(self._destroy_img_list[0], self.rect)
       self.screen.blit(self._destroy_img_list[1], self.rect)
       self.screen.blit(self._destroy_img_list[2], self.rect)
       self.screen.blit(self._destroy_img_list[3], self.rect)
       # 坠毁声音
       self.breakdown_sound = pygame.mixer.Sound(self.down_sound_src)
       self.breakdown_sound.set_volume(0.4)  # 声音大小
       self.breakdown_sound.play()


class Enemy_Small_Plan(Plane):
   """敌方小飞机"""
   plane_images = constants.ENEMY_SMALL_PLAN_IMG_LIST
   # 飞机爆炸图片
   destroy_images = constants.ENEMY_SMALL_PLAN_DESTROY_IMG_LIST
   # 坠毁的音乐
   down_sound_src = constants.ENEMY_SMALL_PLAN_DESTROY_MUSIC

   def __init__(self, screen, speed):
       super().__init__(screen, speed)
       enemy_small_plan_width, enemy_small_plan_hight = self._img_list[0].get_size()
       self.enemy_width_X, self.enemy_height_Y = random.randint(0, int(self.width)), \
                                       random.randint(-(int(enemy_small_plan_hight) * 5),
                                                      -int(enemy_small_plan_hight))
       self.rect.topleft = (self.enemy_width_X, self.enemy_height_Y)


   # def load_src(self):
   #     """加载静态资源"""
   #     # 飞机图像
   #     for img in self.plane_images:
   #         self._img_list.append(pygame.image.load(img))
   #     # 飞机坠毁的图像
   #     for img in self.destroy_images:
   #         self._destroy_img_list.append(pygame.image.load(img))
   #     # 坠毁音乐
   #     if self.down_sound_src:
   #         self.down_sound = pygame.mixer.Sound(self.down_sound_src)
   #     print(len(self._img_list))

   def update(self):
       # self.move(KEY_down)  # 设置按一次键盘就一直保持运动
       # n = 0
       # while n <= 6:
       #     n += 1
       #     enemy_small_plan_width, enemy_small_plan_hight = self._img_list[0].get_size()
       #     enemy_width_X, enemy_height_Y = random.randint(0, int(self.width)), \
       #                                     random.randint(-(int(enemy_small_plan_hight) * 5), 0)
       #     self.rect.topleft = (enemy_width_X, enemy_height_Y)
       #     self.blit_me()
       # 当飞机超出屏幕之外,飞机消失

       self.blit_me()
       self.move_down()
       # super().move_down()
       if self.rect.top >= self.height:
           self.rect.top = self.enemy_height_Y
           print(111)

       # 设置飞机自动向下移动

       # n = 0
       # while n <= 6:
       #     n += 1
       #     enemy_small_plan_width, enemy_small_plan_hight = self._img_list[0].get_size()
       #     enemy_width_X, enemy_height_Y = random.randint(0, int(self.width)), \
       #                                     random.randint(-(int(enemy_small_plan_hight) * 5), 0)
       #     self.rect.topleft = (enemy_width_X, enemy_height_Y)

       self.screen.blit(self._img_list[0], self.rect)




















写回答

1回答

时间,

2019-06-05

同学,你好,这两种方法都是可以的,当子类继承父类之后,会有父类中的属性和方法,可以通过子类的实例去调用该方法。

当子类中要重写父类方法时(与父类方法重名),子类方法的功能包括父类方法功能时,要使用super继承父类方法,不能使用调用。

例:

class Person(object):
    def __init__(self,name):
        self.name=name
    def sayhello(self):
        print('My name is:',self.name)

class Student(Person):

    def sayhello(self):
        super().sayhello()
        # self.sayhello()
        print('aaa')

s = Student('Bill')
s.sayhello()

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

0

0 学习 · 8160 问题

查看课程