Python基础——1.3面向对象
-
创建类时,class的c不要写成大写。类的命名规则是大驼峰,方法,变量是下划线小写规则。
-
任何方法都要在括号内第一个参数加上self
-
__str__
方法由于返回的是string类型,用return重写就好 -
实例化类的对象记得要传入参数
-
打印本对象才会显示其内置的str方法,即:
print(对象名)
-
使用Mac运行程序快捷键control+option+9, win键盘是control+shift+9
-
选中是
option+shift+方向
,跳转到开头/末尾是commond+方向
-
创建类中的内置属性时,不自觉加了
;
号 -
类与类之间要空2行
-
对于本课,将不同的属性添加不需要另外写方法,直接使用初始化的功能就可以解决
-
代码太长用()分割开即可
python自动连接
-
类中的不同方法空一行
24-30 封装案例2
-
初期如何创建一个简单完整的py文件?
-
- 先把程序的需求搞懂,把名词和动词分离,作为不同的类和方法。把类图以表格的形式写出来,包括了对应属性以及方法;
- 不同类之间可能有从属关系。比如说人会使用枪,枪作为人的一个从属类,实例化的对象可能会作为主类的参数传入。所以,优先将从属类编码,方便操作。这样在编写完从属类后,就可以将其折叠,放心的编写主类,而不用来回翻找了;
- 对于类中的方法,我们先要写出它能干什么,按顺序排列好。然后再把形参决定好。如果初始值是需要来自外部,那么就需要形参。不需要就直接定义,如果不知到初始值的具体情况,可以先设置为None;
- 一般方法的第一步要判断某参数是否符合要求,比入溢出否。
-
-
任何方法都要先判断出是条件是否成立
-
不同类间的从属关系不要搞混,写代码之前要明确理清
-
内部属性操作要用对应的方法来执行,不要直接执行,不要忘记
-
__xxx
代表内部属性类或方法,Python解释器在实际操作时,会添加_类名
在前边保证其不备访问,但是不代表真的不能访问。但是在实际操作时,最好还是不要访问私有类或者方法
31-38 继承
- 继承 只要在类后添加
(父类名)
- 继承具有传递性
- 重写分为覆盖(一样的名字)和扩展(先重写,再用
super().父类方法
45-46 多态
- 今后编写任何类都要继承自父类,没有明确就要写上object
- 多态从背后看,就是有不同的相关的类中有相同名字的方法。当另一个类通过不同类形成的实例作为参数传入,从而导致不同的类的方法被触发,导致不同的结果。从表面看就是调用了相同的方法,而输出情况不一。
47-57 类属性,类方法,静态方法
-
类对象的属性,记录与这个类相关的特征,不会记录具体对象的特征
-
在初始化方法中,添加对类属性的操作
-
对象也可以获取类属性(向上查找机制),但是不推荐!
-
类方法:
@classmethod def 类方法名(cls): pass
-
既不访问类属性也不访问实例属性,使用静态方法,不需要创建对象调用类.静态方法
@staticmethod def 静态方法名(): pass
-
多行注释:选中+command+/
-
实例化对象时,记得要取消缩进,否则会算在类中的代码,明显会报错。
58-63 单例模式
-
单例模式保证创建的类有唯一的内存地址,如:垃圾桶,音乐播放器
-
*args
表示是一个多值的元组参数;*kargs
表示是一个多值的字典参数 -
__new__方法的重写:
-
def __new__(cls, *args, **kargs) #1. 重写方法 #2.引用父类方法,记得一定要有cls参数! xxx = super().__new__(cls) #3.返回值 return xxx
-
如果要求初始化也执行一次的话,可以添加类属性标记真假,若真就退出,假就运行后设置为真
64-71 异常
-
异常的格式:
try: pass except 错误1: pass except (错误2,错误3): pass except Exception as result: print("未知错误 %s" % result) else: #没有异常会执行的代码 pass finally: #无论是否异常都会执行的代码 pass
-
异常会先传到被调用者,若还是错误就会传到主程序(这样在主程序添加异常补获降低代码量)
-
<font color=red>我是红色</font>
可以将字体变色 -
主动抛出异常:
# 创建 Exception 对象 xx = Exception("可以将异常提示信息作为参数,这个参数是多元组参数") # 使用 raise 抛出异常 raise xx try: pass except Exception as result: print(result)
72-86 模块和包
-
from xx import x
不需要使用模块名.xx的格式 -
模块中的全局变量,类,方法是作为工具被其他模块所使用的。也就是说,模块中直接执行的代码不需要被执行。这时候就需要内置属性
__name__
-
具体来说,
__name__
在执行自身运行测试代码,会被识别为__main__
。如果是作为模块导入,__name__
则被识别为 模块名 。这样就可以在测试代码部位这样写:def main(): #测试代码在其中 pass if "__name__" == "__main__": #测试代码函数 main()
-
-
包是一个包含多个模块的目录,必须包含
__init__
.py文件 -
把要对外提供的工具都在
__init__
.py中导入 -
选中多行点击backspace没反应是因为开启了Vim格式。在Tools中关闭即可
-
创建包进行以下三步:
#1.创建setup.py #2. $ python setup.py build #3. $ python setup.py sdist
-
注意首先别忘了
__init__.py
里用from . import xxx
(.为当前目录之意)。setup的格式相对固定要了解每一个含义,尤其是包名和包含的模块名要写对 -
.__file__
可以查看文件保存的路径 -
Mac 不自带tree命令,要用 brew install tree 安装
087-095 文件操作
-
文件指针在读取文件后,由开始移动到了结束位置。这时使用read将不能读取到数据
-
读写方式更消耗资源(频繁移动指针),所以一般用只读/写方式操作
-
复制文件:
# 1. 打开文件 file_read = open("README") file_write = open("README[复件]", "w") # 2. 读取并写入文件 while True: # 每次读取一行 text = file_read.readline() # 判断是否读取到内容 if not text: break file_write.write(text) # 3. 关闭文件 file_read.close() file_write.close()
-
文件的其他操作诸如删除目录,重命名可以通过导入os模块类似终端的操作来执行
096-098 文本编码
-
要想使python2.x使用utf-8编码,需要加一行注释:
# *-* coding:utf8 *-*
;因为py2是单子节读取,使用u
可以告诉解释器用utf8编码
099-100 内建函数
-
eval()
可以将字符串自动转换为表达式计算出来 -
千万不要将
input()
的内容直接转换为eval引发安全问题
1.4 飞机大战
004-011 游戏窗口和绘制图像
-
pygame 有固定的代码模块,pygame.init()和pygame.quit()
-
-
绘制图像有三个 步骤:
import pygame #1. 将图像加载至内存 pygame.image.load(file_path) #2. 调用blit()绘制图像 blit(图像, 位置) #3. 更新窗口 pygame.display.update()
-
注意load(),set_mode()都是有返回结果的,别忘了接受其返回值
-
load是image的子方法,不是display的
-
使用while True 不能正常关闭游戏窗口,采用以下代码代替:
while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit()
这样游戏窗口就可以正常的开关,显示了
012-017 游戏循环和键盘事件
-
游戏的循环就意味着游戏正式开始
-
游戏初始化分为:
1.窗口 2.图像位置 3.时钟
-
游戏循环包括:
1.循环 2.交互 3.更新位置 4.更新屏幕
-
pygame.time.Clock可以设置刷新帧率,调用tick(帧率)方法
-
用pygame.Rect来记录英雄的初始位置,包括他的原点,还有大小(宽高)
-
pygame通过pygame.event.get()获得用户当前所做动作的事件列表