鱼C论坛

 找回密码
 立即注册
查看: 3043|回复: 10

[学习笔记] Python学习笔记22-----类与面向对象编程的进阶~ New!

[复制链接]
发表于 2020-8-21 21:06:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 极品召唤兽 于 2020-8-21 21:06 编辑

类的继承
格式  class 子(父):
子代会继承(复制)父代全部的属性和方法


类的多继承
(禁止套娃)
看代码
class Human:
  arms = 2
  legs = 2
  hair = '各种颜色的头发'

  def walk(self):
    print('直立行走')

  def speak(self):
    print('说着各式各样的语言')

class Chinese(Human):
  pass

class JiangSu(Chinese):
  pass

xiaobei = JiangSu()

print(xiaobei.arms)
# 输出:2

xiaobei.walk()
# 输出:直立行走


连环套....

类的多继承

除了继承一个类,我们还可以同时继承多个类,语法是 class 类 A(类 B, 类 C, 类 D):。我们以出生在美国的中国人(ABC,American Born Chinese)为例:

  1. class Chinese:
  2.   hair = '黑头发'
  3.   skin = '黄皮肤'

  4.   def speak_chinese(self):
  5.     print('说汉语')

  6. class American:
  7.   hair = '金头发'
  8.   skin = '白皮肤'

  9.   def speak_english(self):
  10.     print('说英语')

  11. class ABC(Chinese, American):
  12.   pass

  13. abc = ABC()

  14. print(abc.hair)
  15. # 输出:黑头发

  16. print(abc.skin)
  17. # 输出:黄皮肤

  18. abc.speak_chinese()
  19. # 输出:说汉语

  20. abc.speak_english()
  21. # 输出:说英语
复制代码

这是因为 class ABC(Chinese, American): 中 Chinese 靠前,调用实例的属性和方法时会优先在子类中查找,找不到再从最左侧的父类依次往右查找,直到找到为止,如果都没有找到则会报错。



                               
登录/注册后可看大图


类的定制

既然子类继承父类的所有属性和方法,它俩是一样的,为什么不直接使用父类呢?因为类除了可以继承之外,还可以进行定制!我们可以在父类的基础上做以下两点定制:


    创建新的属性和方法
    修改继承自父类的属性和方法


  1. class Human:
  2.   arms = 2
  3.   legs = 2
  4.   hair = '各种颜色的头发'

  5.   def walk(self):
  6.     print('直立行走')

  7.   def speak(self):
  8.     print('说着各式各样的语言')

  9. class Chinese(Human):
  10.   hair = '黑头发'
  11.   skin = '黄皮肤'

  12.   def speak(self):
  13.     print('说汉语')

  14.   def eat(self):
  15.     print('吃米饭')

  16. xiaobei = Chinese()

  17. print(xiaobei.arms)
  18. # 输出:2

  19. print(xiaobei.hair)
  20. # 输出:黑头发

  21. print(xiaobei.skin)
  22. # 输出:黄皮肤

  23. xiaobei.walk()
  24. # 输出:直立行走

  25. xiaobei.speak()
  26. # 输出:说汉语

  27. xiaobei.eat()
  28. # 输出:吃米饭
复制代码


我们可以看到,Chinese 类在 Human 类的基础上新增了 skin 属性和 eat() 方法,并且 Chinese 类自己的 hair 属性和 speak() 方法覆盖了 Human 类中对应的属性和方法。这就是类的定制的两个特点:新增 和 重写

注意点

定义类的方法时,第一个参数 self 不能丢,调用方法时要忽略;
self 作用是代替实例本身,在类中访问类的属性和方法;
初始化方法 __init__() 在类实例化时会自动执行,一般用于类属性的初始化;
子类可以继承父类的所有属性和方法,并且可以定制自己的属性和方法。


x小游戏x
决战 紫禁之巅...
  1. from random import randint, random

  2. class Player:
  3.   def __init__(self, name):
  4.     self.name = name
  5.     self.health = 100
  6.   
  7.   def attack(self, target):
  8.     print(self.name + '发起攻击')
  9.     damage = randint(10, 20)
  10.     target.defend(damage)
  11.   
  12.   def defend(self, damage):
  13.     # 补全 defend() 方法
  14.     if random() > 0.2 :
  15.       self.health -= damage
  16.       print('%s受到%d点伤害,血量剩余%s'%(self.name,damage,self.health))
  17.       if self.health <= 0:
  18.         print(self.name+'被击败')
  19.     else:
  20.       print(self.name+'防御成功')
  21.     print('--------------------')
  22.       
  23. kakarotto = Player('卡卡罗特')
  24. piccolo = Player('比克大魔王')

  25. # 使用循环轮番攻击,当有人被击败后停止循环



  26. while True :
  27.   if kakarotto.health > 0:
  28.     kakarotto.attack(piccolo)
  29.   else:
  30.     break
  31.   if piccolo.health > 0:
  32.     piccolo.attack(kakarotto)
  33.   else :
  34.     break
复制代码


下面即将进入项目实践了0...0
害怕+1


                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 11:12:14 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 18:24:20 | 显示全部楼层
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 18:57:48 | 显示全部楼层

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 22:41:50 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 12:34:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 12:35:59 | 显示全部楼层
继承
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-6 11:18:04 | 显示全部楼层

回帖奖励 +1 鱼币

加油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-6 16:51:28 | 显示全部楼层
吐槽一下【abc = ABC()】是不是在暗示 【from abc import ABCMeta】
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-8 18:12:00 | 显示全部楼层
kogawananari 发表于 2020-9-6 16:51
吐槽一下【abc = ABC()】是不是在暗示 【from abc import ABCMeta】

..?那个不是实例化吗‘’
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-8 21:54:25 | 显示全部楼层
极品召唤兽 发表于 2020-9-8 18:12
..?那个不是实例化吗‘’

没事 无端联想
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 08:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表