|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
|
|