极品召唤兽 发表于 2020-8-21 21:06:15

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

本帖最后由 极品召唤兽 于 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 靠前,调用实例的属性和方法时会优先在子类中查找,找不到再从最左侧的父类依次往右查找,直到找到为止,如果都没有找到则会报错。



https://s1.ax1x.com/2020/08/20/d8fNFO.jpg

类的定制

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

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


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

https://s1.ax1x.com/2020/08/03/adUfk6.gif

hornwong 发表于 2020-8-22 11:12:14

{:5_95:}

蠢蠢熊 发表于 2020-8-22 18:24:20

谢谢

2417944015 发表于 2020-8-22 18:57:48

{:5_110:}

dan维 发表于 2020-8-22 22:41:50

{:5_106:}

CSinYbadF. 发表于 2020-8-24 12:34:09

{:10_277:}

CSinYbadF. 发表于 2020-8-24 12:35:59

继承

sinsoledad 发表于 2020-9-6 11:18:04

加油

kogawananari 发表于 2020-9-6 16:51:28

吐槽一下【abc = ABC()】是不是在暗示 【from abc import ABCMeta】{:5_102:}

极品召唤兽 发表于 2020-9-8 18:12:00

kogawananari 发表于 2020-9-6 16:51
吐槽一下【abc = ABC()】是不是在暗示 【from abc import ABCMeta】

..?那个不是实例化吗‘’

kogawananari 发表于 2020-9-8 21:54:25

极品召唤兽 发表于 2020-9-8 18:12
..?那个不是实例化吗‘’

没事 无端联想{:5_102:}
页: [1]
查看完整版本: Python学习笔记22-----类与面向对象编程的进阶~ New!