hm_python学习记录

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文件?

      1. 先把程序的需求搞懂,把名词和动词分离,作为不同的类和方法。把类图以表格的形式写出来,包括了对应属性以及方法;
      2. 不同类之间可能有从属关系。比如说人会使用枪,枪作为人的一个从属类,实例化的对象可能会作为主类的参数传入。所以,优先将从属类编码,方便操作。这样在编写完从属类后,就可以将其折叠,放心的编写主类,而不用来回翻找了;
      3. 对于类中的方法,我们先要写出它能干什么,按顺序排列好。然后再把形参决定好。如果初始值是需要来自外部,那么就需要形参。不需要就直接定义,如果不知到初始值的具体情况,可以先设置为None;
      4. 一般方法的第一步要判断某参数是否符合要求,比入溢出否。
  • 任何方法都要先判断出是条件是否成立

  • 不同类间的从属关系不要搞混,写代码之前要明确理清

  • 内部属性操作要用对应的方法来执行,不要直接执行,不要忘记

  • __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()获得用户当前所做动作的事件列表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值