python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程
一些关于自己学习Python的经历的内容,遇到的问题和思考等,方便以后查询和复习。
声明:本人学习是在扇贝编程通过网络学习的,相关的知识、案例来源于扇贝编程。如果使用请说明来源。
第27关 类与面向对象编程
练习:自己编写一个类
这一次我们不给任何提示,完全凭你自己写一个类。你可以思考一下生活中还有哪些“类”,有哪些特征和行为?然后用代码的方式写出来吧!
class Human: #定义类的时候,类名称后面没有括号和参数
arms = 2
legs = 2
eyes = 2
ears = 2
nose = 1
hair = '各种颜色的头发'
def speak(self): #方法里面都是类的行为。
print('会说话')
def walk(self):
print('会走路')
def work(self):
print('会做各种工作或者工具')
class Chinese(Human):
pass
class Jiangsu(Chinese):
hair = '黑色头发'
def work(self):
print('会走馒头和花卷')
def speak(self):
print('会说汉语,普通话不太标准')
#这几个我最初放在了实例化lijsh后面,导致错误,实例化之后,直接调用,不进行赋值
lijsh = Jiangsu() #这里有个括号,但是没有英文冒号
print(lijsh.arms)
print(lijsh.legs)
print(lijsh.eyes)
print(lijsh.hair)
lijsh.work()
lijsh.speak()
lijsh.walk()
练习:第一武道会
五年一届的“天下第一武道会”又开始了!接下来登场的选手是卡卡罗特和比克大魔王,他们的初始血量都为 100,轮番攻击,每次攻击打出 10-20 点伤害,对方有 20% 的几率防御成功不受伤害。
Player 类的主体已经完成,还差一个 defend()(防御) 方法,请你根据要求补全它并补全轮番攻击的代码。
要求:
当受到伤害时,将当前血量(health)减去伤害值(damage),并打印出 xxx受到xx点伤害,血量剩余xx;
有 20% 的几率防御成功不受伤害,血量不变并打印出 xxx防御成功;
当受到伤害后,血量小于等于 0 时打印 xxx被击败;
使用循环使两人轮番攻击,当其中一人血量小于等于 0 时,结束循环。
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 damage > 0:
health = health - damage
print('%s受到%d点伤害,血量剩余%d'%(self.name, ))
kakarotto = Player('卡卡罗特')
piccolo = Player('比克大魔王')
# 使用循环轮番攻击,当有人被击败后停止循环
kakarotto.attack(piccolo)
piccolo.attack(kakarotto)
我编写一半是在写不下去了,就放弃了,看了答案
根据答案写的代码:
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: #random()生成0-1不包括1的小数。
self.health = self.health - damage
print('%s受到%d点伤害,血量剩余%d'%(self.name, damage, self.health))
if self.health <= 0:
print(self.name + '被击败')
else:
print(self.name + '防御成功')
print('----------------------')
kakarotto = Player('卡卡罗特')
piccolo = Player('比克大魔王')
# 使用循环轮番攻击,当有人被击败后停止循环
#kakarotto.attack(piccolo)
piccolo.attack(kakarotto)
kakarotto.attack(piccolo)
while True:
if kakarotto.health > 0:
kakarotto.attack(piccolo)
else:
break
if piccolo.health > 0:
piccolo.attack(kakarotto)
else:
break
感觉程序越来越复杂,前后的逻辑关系,引用关系等,都越来难以把握了。比如这个程序,我能看懂程序,知道功能和作用,运行的逻辑等,但是自己写不出来。不知道最初写代码的人是不是都是我这样,还是我创新力差,年纪大反应慢。哎
练习:类的继承和调用
之前写过一个 Bird 类,这次我们再写一个继承自 Bird 类的 Lark(百灵鸟)类。Lark 类里只有一个空语句 pass,然后将 Lark 类实例化并调用 Bird 类中的 intro() 方法。
class Bird:
wings = 2
def fly(self):
print('我会飞')
def intro(self):
print('我有%d只翅膀' % self.wings)
self.fly()
class Lark(Bird):
pass
lark = Lark()
lark.intro()
练习:类的多重继承
骡为马和驴杂交的产物,公驴和母马生的为马骡(Mule),公马和母驴生的为驴骡(Hinny)。
现在已经有了 Horse(马)类和 Donkey(驴)类,请你创建一个 Mule 类(马骡)和 Hinny(驴骡)类,分别继承自 Horse、Donkey 和 Donkey、Horse,然后对其进行实例化,试试调用其中的属性和方法。
# 马
class Horse:
character = '性格温顺'
def ride(self):
print('我能作为骑乘')
# 驴
class Donkey:
character = '性格暴躁'
def work(self):
print('我能拉磨')
# 马骡
class Mule(Horse, Donkey):
pass
# 驴骡
class Hinny(Donkey, Horse):
pass
mule = Mule()
hinny = Hinny()
print(mule.character)
mule.work()
mule.ride()
print(hinny.character)
hinny.ride()
hinny.work()
练习:类的定制
小贝最近拜了个武林高手为师,大师将武功秘籍 九阴真经 和武功 九阴白骨爪 都传授给了小贝。小贝刻苦练习将 九阴白骨爪 改进成了 九阴白骨爪改进版,并自学了武功秘籍 九阳神功 练成了 金刚不坏之躯。
模板代码中已经替你写好了 Master(师傅) 类,接下来请你补全 Apprentice(徒弟) 类使代码正常运行。
要求:
Apprentice 类继承 Master 类;
Apprentice 类中新增一个 book2 的属性,值为 九阳神功,新增一个 kungfu2() 的方法,功能是打印出 金刚不坏之躯;
Apprentice 类中重写 kungfu() 方法,改成打印出 九阴白骨爪改进版。
# 师傅
class Master:
book = '九阴真经'
def kungfu(self):
print('九阴白骨爪')
# 补全徒弟的代码
class Apprentice(Master):
#book = '九阴真经'
book2 = '九阳神功'
def kungfu(self):
print('九阴白骨爪改进版')
def kungfu2(self):
print('金刚不坏之躯')
xiaobei = Apprentice()
print(xiaobei.book)
print(xiaobei.book2)
xiaobei.kungfu()
xiaobei.kungfu2()
学习笔记:
类的继承
通过 class 子类名(父类名) 的方式实现了类的继承,让子类拥有了父类的所有属性和方法。
class Chinese(Human):
pass
提示:pass 是空语句,表示跳过,什么都不做。
类的多层继承
继承不只是子类继承父类的属性和方法,当父类还有自己的父类时,子类也能继承父类的父类的属性和方法。
class Chinese(Human):
pass
class JiangSu(Chinese):
pass
类的属性和方法会通过继承一直传递下去,减少了大量的重复代码,实现了代码的复用。
类的多重继承
除了继承一个类,我们还可以同时继承多个类,语法是 class 类 A(类 B, 类 C, 类 D):。
class ABC(Chinese, American):
pass
class ABC(Chinese, American): 中 Chinese 靠前,调用实例的属性和方法时会优先在子类中查找,找不到再从最左侧的父类依次往右查找,直到找到为止,如果都没有找到则会报错。
类的定制
你可能会有疑问,既然子类继承父类的所有属性和方法,它俩是一样的,为什么不直接使用父类呢?因为类除了可以继承之外,还可以进行定制!我们可以在父类的基础上做以下两点定制:
新增:创建新的属性和方法
重写:修改继承自父类的属性和方法
新增 指在继承父类的属性和方法的基础上添加自己独有的属性或方法。比如:师傅传授给你一套武功,你自己又练了别的功法,这样你就既继承了师傅的功法,也独创了自己的功法。
重写 指在继承父类的属性和方法的基础上重写父类的属性和方法。比如:师傅传授给你一套武功,你对其进行了改进,同样的功法就变成你的独创功法。
需要注意的点:
定义类的方法时,第一个参数 self 不能丢,调用方法时要忽略;
self 作用是代替实例本身,在类中访问类的属性和方法;
初始化方法 __init__() 在类实例化时会自动执行,一般用于类属性的初始化;
子类可以继承父类的所有属性和方法,并且可以定制自己的属性和方法。
第27关
python面向对象编程72讲_2020-07-22 Python学习笔记27类和面向对象编程相关推荐
- 《Python核心编程(第3版)》学习笔记及书评
<Python核心编程(第3版)>学习笔记 文章目录 <Python核心编程(第3版)>学习笔记 写在前面 1. 正则表达式 1.1 常用语法 1.2 re模块 2. 网络编程 ...
- Python语言入门这一篇就够了-学习笔记(十二万字)
Python语言入门这一篇就够了-学习笔记(十二万字) 友情提示:先关注收藏,再查看,12万字保姆级 Python语言从入门到精通教程. 文章目录 Python语言入门这一篇就够了-学习笔记(十二万字 ...
- Linux学习笔记(3)- 网络编程以及范例程序
Linux学习笔记(3)- 网络编程以及范例程序 前言 网络介绍 IP地址的介绍 端口和端口号的介绍 通信流程 socket介绍 TCP介绍 python3编码转换 TCP客户端程序开发流程 多任务版 ...
- AI初学笔记4 类与面向对象的创建
AI初学笔记4 类与面向对象的创建 文章目录 AI初学笔记4 类与面向对象的创建 一.什么是类,什么是面向对象 代码实现 二.实例属性 代码实现 三.实例属性应用 代码实现 四.魔法方法 五.案例编写 ...
- Java 3D编程实践_Java 3D编程实践——网络上的三维动画[学习笔记]
评论 # re: Java 3D编程实践--网络上的三维动画[学习笔记] 2006-08-24 23:41 gy # re: Java 3D编程实践--网络上的三维动画[学习笔记] 2007-03-2 ...
- Python学习笔记 (类与对象)
Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...
- 《疯狂Java讲义》学习笔记 第六章 面向对象(下)
<疯狂Java讲义>学习笔记 第六章 面向对象(下) 6.1包装类 基本数据类型 包装类 byte Byte short Short int Integer long Long char ...
- 阿里云“7天实践训练营”入门班第二期学习笔记 第五天 在线编程挑战
阿里云"7天实践训练营"入门班第二期学习笔记 第五天 在线编程挑战 吾辈,完全不会编程 以下内容全程来自阿里云社区的大佬分析讲解 原题目 知识点:搜索.字符串.位运算 有一天Jer ...
- 《Python地理空间分析指南 第2版》学习笔记-5.1 距离测量
第5章 Python与地理信息系统 本章主要学习Python处理矢量数据,包含以下内容: 距离测量 坐标转换 矢量数据重投影 Shapefile 文件编辑 海量数据过滤 专题地图创建 非GIS数据类型 ...
最新文章
- 根际微生物组提高植物耐盐性的研究进展(Biotechnology Advances IF=10)
- wsl设置c盘自动挂载到wsl中的/c/目录下
- 在SQL Server里如何进行页级别的恢复
- 文献记录(part20)--Discriminative metric learning for multi-view graph partitioning
- 自定义滚动条(Custom ScrollBar)
- rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读
- 计算机网络技术放块队解说词,基于《计算机网络技术》课程多媒体课件制作与设计.doc...
- UE3 使用光源函数
- java n*n矩阵求值及求逆矩阵
- 双缓冲(Double Buffer)原理和使用【转】
- 使用Doxygen + graphviz生成Unity 3d的UGUI类图
- 用java写一个用户登陆界面的代码分享
- python程序设计搜题软件下载_智慧职教云课堂APPPython程序设计期末考试搜题公众号答案...
- win7 java修复工具哪个好_DLL修复工具哪个好
- QQ坦白说查看好友方法攻略
- 最新最全省级面板数据(1997-2020)
- Latex的各种帽子
- 基于微信小程序的学习记录与提醒应用设计与实现-计算机毕业设计源码+LW文档
- 云计算与大数据技术 李春燕
- Springboot错误页面和错误信息定制