- 要求: 看完本章节所有课程内容,并完成作业,优先回答和作业相关的问题
- 有什么问题在评论区回复
本章演示代码
学习Python思路
基础路线
参考资料
- 官方文档
进阶学习
- Python cookbook(难度较大,有基础后阅读)
Python Cookbook 3rd Edition Documentation — python3-cookbook 3.0.0 文档
常见问题汇总
- 直接上传代码,不要传压缩包
- 不要再venv中写代码
书写问题
- 缩进问题
- 环境配置问题(包管理)
- 不要上传venv在自己的仓库里面,可以在.gitignore中添加忽略
- 如果需要环境管理,使用下面的命令
生成环境配置文件
pip3 freeze > requirements.txt
- 文件管理
- 命名问题
- 符合规范性,命名要见名知意
- 不要用关键字命名
如何Debug定位问题
Debug 的方式
作业
题目
- 创建两个类,分别叫做Timo 和Jinx。 每个类都包含有hp、power 这两个类变量
- 分别在两个类都创建一个 fight 方法,fight 方法的参数为 题目要求的参数
作业思路解析
@startuml
Class HeroFactory{
Class create_hero()
}
class Hero{
#int hp
#int power
~ fight()
}
class Jinx{
#int hp
#int power
~ fight()
~String speak_lines()
}
class EZ{
#int hp
#int power
~ fight()
~String speak_lines()
}
HeroFactory--> EZ: 实例化
HeroFactory--> Jinx: 实例化
Hero<|-- EZ : 继承
Hero<|-- Jinx: 继承
@enduml
优秀作业
刘志华
- 虽然只是拓展了简单的for 循环,但是还是值得鼓励,而且代码写的很整洁
曾初开
https://gitee.com/zengchukai/test-study/blob/master/two_week_homework/hero.py
- 点评: 虽然语法知识都是课程内的,但是尝试将录播学到的知识内容融入作业中。是非常好的学习习惯
卢树涛
https://gitee.com/lushutao2/myhomework/tree/master/python%20homework
- 点评: 敢于拓展,想法很多,基础扎实,对于python语法知识比较熟悉
- 建议:注释可以多写一些,给其他同学多多参考一下
杨宇帆
https://gitee.com/sailyang00/ceshiren/tree/master/class2/moudle1/pythonProject
- 点评:对 python 的语法基础还是很不错的,而且编程很有想法,没有为了完成作业而完成作业,加了很多自己了解的python语法知识进去,还使用了配置文件管理数据
- 建议: 文件管理有点乱和项目无关的文件比如 venv 可以放在.gitignore中,
__call__
在这个场景下可以使用类装饰器实现,__new__
的参数建议设定成不定长参数,因为构造函数一旦多传参数进去,就会报错
classmethod、 staticmethod
from random import randint
class Hero:
# 比如 类变量已经定义好了,因为
# 可能有其他同事正在使用这个类
#
hero_hp = 0
hero_power = 0
hero_name = ""
def fight(self, enemy_hp, enemy_power, enemy_name):
"""
:param enemy_hp: 敌人的血量,是整型
:param enemy_power: 敌人的血量,是整型
:return:
"""
# 在定义死循环,一定要有终止条件,以及跳出循环的步骤比如break。
while True:
# 计算英雄最终的血量, 通过self.类变量 去调用 类中的类变量
self.hero_hp = self.hero_hp - randint(1, enemy_power)
# 计算敌人的最终血量
enemy_hp = enemy_hp - self.hero_power
print(f"{self.hero_name}的血量为{self.hero_hp}, {enemy_name}的血量为{enemy_hp}")
# 判断谁的血量先到0
if self.hero_hp<=0:
print(f"{enemy_name}赢了")
break
elif enemy_hp<=0:
print(f"{self.hero_name}赢了")
break
@classmethod
def name_add_number(cls, nickname):
cls.hero_name = cls.hero_name + nickname
print(cls.hero_name)
def name_add_number_instance(self):
self.hero_name = self.hero_name+ "3号"
class Jinx(Hero):
hero_hp = 1200
hero_power = 210
hero_name = "Jinx"
# def __init__(self):
class EZ(Hero):
hero_hp = 1100
hero_power = 190
hero_name = "EZ"
class Timo(Hero):
hero_hp = 1100
hero_power = 190
hero_name = "timo"
if __name__ == '__main__':
# 多行注释快捷键 alt + /
EZ.name_add_number("2号")
ez = EZ()
# ez.name_add_number_instance()
ez2 = EZ()
print(ez.hero_name)
print(ez2.hero_name)
# jinx.fight(ez.hero_hp, ez.hero_power)
# ez.fight(jinx.hero_hp, jinx.hero_power, "Jinx")
#
from python_practice.hero import EZ, Jinx, Timo
# static 使用场景
class HeroFactory:
# staticmethod 使用场景,
# 方法所有涉及到的逻辑都没有使用实例方法或者实例变量的时候
@staticmethod
def create_hero(hero):
# 快捷导入 alt/option + 回车
# 当传入的参数为ez 的时候,返回
# EZ 的实例对象
if hero == "ez":
return EZ()
elif hero == "jinx":
return Jinx()
elif hero == "timo":
# 鼠标左键 加 ctrl/command 可以进行代码的跳转
return Timo()
# 当传入的参数都不符合上面的条件时,报出异常
else:
raise Exception("此英雄不在英雄工厂当中")
# 判断语句, __name__ 变量, "__main__"字符串
if __name__ == '__main__':
print("这是main")
#节省实例化的过程
jinx = HeroFactory.create_hero("jinx")
ez = HeroFactory.create_hero("ez")
jinx.fight(ez.hero_hp, ez.hero_power, ez.hero_name)