24夏python笔记

目录

1. self使用

  • 一定要在类中的def后的括号中加self

2. def __str__(self)函数

  • 用来定义直接输出类时输出的字符串内容,此函数要有输出!

3. 基本类的dir()函数

  • 查找一个对象的所有属性和方法

4. 基本类的id()函数

  • 函数用于获取对象的唯一标识符

5. global关键字

  • 将类中的变量声明为全局变量

6. __mro__函数

1. 定义:
  • “方法解析顺序”(Method Resolution Order)
2. 使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A:
def method(self):
print("A method")

class B(A):
def method(self):
print("B method")

class C(A):
def method(self):
print("C method")

class D(B, C):
pass


print(D.__mro__)
1
2
3
# 输出
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

7. super().方法作用

  • 在类中调用父类的被重写的方法

8. 面向对象(OOP)三大特征

  • 封装
  • 继承
  • 多态

9. 类方法

1. 声明
  • 需要加装饰器@classmethod
  • 同时传入参数栏由self变为cls,不需要创建对象即可使用方法
2. 使用注意事项
  • 当用对象名查询类属性,对象内找不到,会向上查询类的属性,结果为类属性
  • 当用类名修改类属性,会对类属性修改
  • 当用对象名修改类属性,不会向上查找类,而是创建一个和类属性同名的对象属性,类属性不修改

10. 静态方法

1. 声明
  • 需要加装饰器@staticmethod
2. 注意事项
  • 用于不需要调用 类/实例的属性/方法的方法
  • 无传入参数,也不用self

11. 异常处理

  • 利用try和except处理异常,try中是可能出现的异常,except是出现这种异常后的操作

  • 可以用一下代码来处理未知异常,并把异常名称输出

    1
    2
    except Exception as result:
    print("error:%s" % result)
  • 可以创建异常对象,如一下代码,实现自己创建异常,自己抛出异常

    1
    2
    ex = Exception("’错误信息‘")
    raise ex

12. 模块的导入

  • import 模块名(文件名) as 别名用来导入相关的整个文件,通过模块名/别名.的方式调用工具

  • from 模块名(文件名) import 工具名用来导入某一模块的部分工具,此时导入后的工具不需要通过模块名.的方式,可直接使用

  • from 模块名(文件名) import *也是导入整个模块,但是可以在不通过模块名.的方式直接调用全局变量,函数和类。虽方便,不推荐使用

  • 如果你从不同的模块中导入了两个同名的函数,并且在代码中调用该函数,最后导入的那个函数会覆盖之前导入的函数。

    1. 例子如下:

    test2.py

    1
    2
    def hh():
    print("hh! this is test2")

    test3.py

    1
    2
    def hh():
    print("hh! this is test3")

    test.py

    1
    2
    3
    from test3 import hh
    from test2 import hh
    hh()

    test.py运行结果:

    1
    hh! this is test2
    2. 解决方法
    1. 使用别名,将导入的同名工具重新命名
    2. 导入整个模块,在调用时用模块名.的方法区分
  • 模块的搜索顺序

    1. 先搜索当前目录,再对系统目录进行搜索
    2. 给文件起名不要和系统的模块文件重名
    3. python中每一个模块都有一个内置属性__file__可以查看模块的完整路径
    1
    2
    # 查看random模块的完整路径
    print(random.__file__)
  • 在导入模块时,被导入文件中的可以直接执行的代码会在import执行时被直接执行

    解决方案:
    • 可以在被导入文件中利用以下代码,来进行被导入文件的功能测试,同时又不会影响到其他文件的调用
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      # 导入模块
      # 定义全局变量
      # 定义类
      # 定义函数

      # 在代码的最下方
      def main():
      # 对本文件的测试代码放在这里
      pass

      # 本文件运行时执行,被调用时不执行
      if __name__ == "__main__":
      main()
    • __name__ 的作用
      • 直接运行模块时:如果直接运行一个 Python 文件,__name__ 变量会被设置为 “__main__“字符串。
      • 模块被导入时:如果一个 Python 文件被导入到另一个脚本中作为模块使用,__name__变量会被设置为模块的名字(不包括 .py 扩展名的文件名)

13. 包(package)

  • 包时包含多个模块的特殊目录
  • 包必须含有__init__.py这个特殊文件
  • 作用时一次性导入多个模块
  • __init__.py文件中要指定对外界提供的(包目录内的)模块列表
    1
    2
    # . 表示当前目录
    from . import 模块列表

14. 文件操作函数

open()函数
  • 默认以只读方式打开文件,返回文件对象
  • 打开文件的语法如下:
    f = open("文件名", "访问方式")
  • 访问方式具体参数含义如下:
    访问方式 说明
    r 只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。如果文件不存在,抛出异常
    w 写入方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件
    a 追加方式打开文件。如果该文件已经存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入
    r+ 读写方式打开文件。文件的指针将会放在文件的开头。如果文件不存在,抛出异常
    w+ 读写方式打开文件。如果文件存在会被覆盖。如果文件不存在,创建新文件
    a+ 读写方式打开文件。如果该文件已经存在,文件指针将会放在文件的结尾。如果文件不存在,创建新文件进行写入
read()函数
  • 当运行玩read()函数读取文件信息后,文件指针会移动到文件末尾,若再次调用,则读取不到任何信息
readline()函数
  • read()会将文件一次性读入,如果文件过大,内存占用会非常严重,而利用readline()函数进行循环读入便可节省内存资源
write()函数
  • 用来将文本写入文件
close()函数
  • 用来释放文件占用的内存空间

15. eval()函数

作用:
  • 将字符串当作有效的表达式来求值 并返回计算结果
例子:
  • 1
    2
    3
    # 基本的数学计算
    In [1]: eval("1 + 1")
    Out[1]: 2
  • 1
    2
    3
    # 字符串重复
    In [2]: eval('"*" * 10')
    Out[2]: '**********'
  • 1
    2
    3
    # 将字符串转换成列表
    In [3]: type(eval("[1, 2, 3, 4, 5]"))
    Out[3]: list
  • 1
    2
    3
    # 将字符串转换成字典
    In [4]: type(eval("{'name': 'xiaoming', 'age': 18}"))
    Out[4]: dict
注意事项
  • 不能使用eval()函数直接转换input()的结果!当输入其他系统指令时,也会将字符串转化为命令执行,对系统有很大的安全性隐患
  • 程序代码
    1
    2
    input_str = input("请输入算术题:")
    print(eval(input_str))
  • 输入:
    __import__("os").system("rm aaa")
  • 结果会将当前目录的aaa文件删除,严重影响系统的安全性