鱼C论坛

 找回密码
 立即注册
查看: 2785|回复: 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)为例:

class Chinese:
  hair = '黑头发'
  skin = '黄皮肤'

  def speak_chinese(self):
    print('说汉语')

class American:
  hair = '金头发'
  skin = '白皮肤'

  def speak_english(self):
    print('说英语')

class ABC(Chinese, American):
  pass

abc = ABC()

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

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

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

abc.speak_english()
# 输出:说英语

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



                               
登录/注册后可看大图


类的定制

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


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

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

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

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

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

  def speak(self):
    print('说汉语')

  def eat(self):
    print('吃米饭')

xiaobei = Chinese()

print(xiaobei.arms)
# 输出:2

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

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

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

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

xiaobei.eat()
# 输出:吃米饭

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

注意点

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


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

class Player:
  def __init__(self, name):
    self.name = name
    self.health = 100
  
  def attack(self, target):
    print(self.name + '发起攻击')
    damage = randint(10, 20)
    target.defend(damage)
  
  def defend(self, damage):
    # 补全 defend() 方法
    if random() > 0.2 :
      self.health -= damage 
      print('%s受到%d点伤害,血量剩余%s'%(self.name,damage,self.health))
      if self.health <= 0:
        print(self.name+'被击败')
    else:
      print(self.name+'防御成功')
    print('--------------------')
      
kakarotto = Player('卡卡罗特')
piccolo = Player('比克大魔王')

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



while True :
  if kakarotto.health > 0:
    kakarotto.attack(piccolo)
  else:
    break
  if piccolo.health > 0:
    piccolo.attack(kakarotto)
  else :
    break

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


                               
登录/注册后可看大图

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 18:24:20 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-22 22:41:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 12:34:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-24 12:35:59 | 显示全部楼层
继承
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-6 16:51:28 | 显示全部楼层
吐槽一下【abc = ABC()】是不是在暗示 【from abc import ABCMeta】
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

..?那个不是实例化吗‘’
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

没事 无端联想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 00:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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