Day18-面向对象
1.正则补充
-
匹配对象 - 获取匹配结果
result = search(r'(\d{2})([a-z]{3})', '是否合计23mkn822h计划书89js923') print(result) # <re.Match object; span=(4, 9), match='23mkn'> # 匹配对象.group() - 获取整个正则表达式在字符串中的匹配结果 print(result.group()) # '23mkn' # 匹配对象.group(N) - 获取正则中第N个分组匹配到的结果(捕获第N个分组的内容) print(result.group(1)) # '23' print(result.group(2)) # 'mkn'
-
忽略大小写 - 匹配的时候小写字母可以直接和对应的大写字母匹配
方法1: 在正则表达式的最前面加 (?i)
方法2: 给正则相关函数的flags赋值为I或IGNORECASEresult = fullmatch(r'(?i)abc', 'AbC') print(result) from re import I, IGNORECASE result = fullmatch(r'abc', 'AbC', flags=IGNORECASE) print(result)
-
单行匹配
正则匹配的时候默认是多行匹配,多行匹配的时候.不可以和\n进行匹配;
单行匹配下.可以和\n进行匹配。方法1:在正则表达式的最前面加 (?s)
方法2: 给正则相关函数的flags赋值为Sresult = fullmatch(r'(?s)a.b', 'a\nb') print(result) result = fullmatch(r'a.b', 'a\nb', flags=S) print(result) # 一起用: result = fullmatch(r'(?si)a.b', 'A\nb') print(result) result = fullmatch(r'a.b', 'A\nb', flags=I|S) print(result)
2.编程思想
-
面向过程编程(穷人思想) - 遇到问题马上就想怎么按照步骤一步一步解决这个问题
-
函数式编程(小资思想) - 遇到问题先思考有没有一个已经存在的函数具备这个功能,如果有直接调用函数;没有就去创建具备这个功能的函数。
-
面向对象编程(富豪思想) - 遇到问题就先思考有没有一个对象具备解决这个问题的能力,如果有 就直接用。没有就创建一个这样的对象。没有还要创建类。
3.认识类和对象
-
类
类就是拥有相同功能相同属性的对象的集合 - 类是一个抽象的概念
对象就是类的实例(类的具体表现)人是类 - 具体的一个人就是人的对象,比如:骆昊这个人、余婷这个人
杯子是类 - 具体的一个杯子就是杯子的对象,比如,我的桌子这个杯子 -
定义类---------用代码说清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合
-
定义类的任务:用代码说清楚这个类是拥有哪些相同功能和哪些相同属性的对象的集合
相同功能 - 用函数描述功能
相同属性 - 用变量描述属性 -
定义类的语法:
class 类名:
类的说明文档
类的内容(由属性和方法组成) -
说明:
class - 关键字,固定写法
类名 - 由程序员自己命名
要求:是标识符;不是关键字
规范:见名知义;采用驼峰式命名,并且第一个字母大写;不使用系统函数名、类名、模块名
: - 固定写法
类的说明文档 - 多行注释
类的内容 - 由属性和方法组成
属性 - 定义在类中的变量
方法 - 定义在类中的函数 -
class Person:
“”“人类”“”
pass
-
-
创建对象
语法:
类名()p1 = Person()
p2 = Person()
4.类中的方法
方法就是定义在类中函数,它是用来描述这个类具备的相同功能有哪些。
方法分为:对象方法、类方法、静态方法
-
对象方法
怎么定义: 直接定义在类中的函数就是对象方法
怎么调用:通过’对象.xxx()'的形式调用对象方法
特点: 自带参数self,通过对象调用这个方法的时候self不需要传参,系统会自动将当前对象传给self(谁调用self就指向谁)
使用场景:如果实现函数的功能只要需要对象(需要对象属性),就将函数定义成对象方法 -
类方法
怎么定义:在定义函数前加装饰器:@classmethod
怎么调用: 通过’类.xxx()'的形式来调用类方法
特点: 自带参数cls,通过类调用这个方法的时候cls不需要传参,系统会自动将当前类传给cls(调用调用指向谁)
使用场景:如果实现函数的功能不需要对象,就使用类方法或者静态方法 -
静态方法
怎么定义: 在定义函数前加装饰器:@staticmethod
怎么调用: 通过’类.xxx()'的形式来调用静态方法
特点:没有特点
使用场景:如果实现函数的功能不需要对象,就使用类方法或者静态方法
5.初始化方法
-
__ init __方法 - 初始化方法
魔法方法:类中所有名字以两个下划线开头并且以两个下划线结尾的方法名都是魔法方法,所有的魔法方法都不需要程序员去调用,系统会在特定情况下自动调用对应的魔法方法。
注意:python的类有哪些魔法方法是固定的,每个魔法方法什么时候调用也是固定。
__ init __在通过类创建对象的时候会被自动调用。(每次通过类创建对象的时候,系统都会自动调用这个类中的__init__方法)
6.属性
属性就是定义在类中的变量,属性分为类属性和对象属性两种
-
类属性
怎么定义:直接定义在类中的变量就是类属性
怎么使用:通过’类.xxx’的形式来使用
什么时候用:如果属性值不会因为对象不同而不一样就定义成类属性,例如,圆的圆周率 -
对象属性
怎么定义:以’self.属性名=值’的形式定义在__init__方法中
怎么使用:通过’对象.xxx’的形式来使用对象属性
什么时候用:如果属性值会因为对象不同而不一样就定义成对象属性,例如,圆的半径# 案例:定义圆类,拥有属性半径和圆周率,方法:求圆的面积、求圆的周长 class Circle: pi = 3.1415926 def __init__(self, r): self.r = r def get_area(self): # 在实现函数功能的时候如果需要对象属性,就通过self来提供 return Circle.pi * self.r ** 2 c1 = Circle(1) c2 = Circle(10) print(c1.get_area()) print(c2.get_area())