2026年7月21日星期二

今天是我学习的第八天,学习了python的面向对象。

主要内容:

1.面向对象:

面向对象是一种编程思想,把程序看作一组对象的交互,不再单纯用函数、变量分步执行(面向过程)。现实里一切事物都可以抽象成「对象」,比如学生、手机、汽车。

2.成员变量:
类的定义语法格式:
class 类名称:   class:关键字,表示要定义类
    类的属性     类的属性:即定义在类中的变量(成员变量)
    类的行为     类的行为:即定义在类中的函数(成员方法)

创建类对象语法:
    对象名 = 类名()

类 = 属性(数据) + 行为(函数)

成员变量和成员方法:
class Student:
    # 属性
    name = "张三"
    age = 18

    # 行为
    def say_hi(self):
        print("大家好,我叫张三!")

可以看出,类中:
    不仅可以定义属性用来记录数据
    类中还可以定义函数来记录行为
其中:
    类中定义的属性(变量),称之为:成员变量
    类中定义的行为(函数),称之为:成员方法

成员方法的定义语法:
在类中定义成员方法和定义函数基本一致,但仍然有细微区别:
语法格式:
    def 方法名(self,形参1,......形参N):
        方法体

可以看到,在方法定义的参数列表中,有一个:self关键字
self关键字是成员方法定义时,必须填写的:
    (1)它是用来表示类对象自身的意思
    (2)当我们使用类对象调用方法时,self会自动被Python传入
    (3)在方法内部,想要访问的成员变量,必须使用self
注:self关键字,尽管在参数列表中,但是传参的时候可以忽略它。

3.类和对象:
基于类创建对象的语法:对象名 = 类名()
类只是一种程序内的 "设计图纸",需要基于图纸生产实体(对象),才能正常工作这这套路,称之为:面向对象编程。

4.python构造方法:

构造方法:
Python类使用__init__(),称之为构造方法
可以实现:
    在创建类对象(构造类)的时候,会自动执行。
    在创建类对象(构造类)的时候,将传入参数自动传递给__init__()方法使用。

注:
    1、构造方法名:__init__ 千万不要忘记前后2个下划线
    2、构造方法也是成员方法,不要忘记在参数类表中提供self关键字。

5.python内置方法:

魔术方法:这些内置方法,各自有各自特殊的功能,称之为:魔术方法
 __init__ 构造方法,是python类内置的方法之一。
 常用魔术方法:
     __init__()   构造方法
     __str__() 字符串方法
     __lt__()  小于符号比较
     __gt__()大于符号比较
     __le__()  小于等于符号比较
     __ge__() 大于等于符号比较
     __eq__()  == 符号的比较

__eq__()魔法方法,就必须提到Python中的is和==。先来看看这两者的区别:
is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。
==在比较类时,会默认调用object.__eq__方法,默认比较两个对象的地址(id)

<    object.__lt__(self, other)
<=    object.__le__(self, other)
==    object.__eq__(self, other)
!=    object.__ne__(self, other)
>=    object.__ge__(self, other)
>    object.__gt__(self, other)

6.封装:

基于模板(类)去创建实体(对象),使用对象完成功能开发。

封装:表示的是将现实世界的事物的:
    1、属性
    2、行为
封装到类中,描述为:
    1、成员变量
    2、成员方法
从而完成程序对现实世界事物的描述。
对用户隐藏的属性和行为
现实世界的事物,有属性和行为,但是不代表这些属性和行为都是开放给用户使用的。

私有成员:
既然现实世界的事物有不公开的属性和行为,那么作为现实世界事物在程序中映射的类,也应该支持。
类中提供了私有成员的形式来支持。
    1、私有成员变量
    2、私有成员方法
定义私有成员的方法:
    1、私有成员变量:变量名以 __开头
    2、私有成员方法:方法名以 __开头

使用私有成员:
私有成员无法被类对象使用,但是可以被其他的成员使用。

7.继承:

继承分类:单继承和多继承
继承:表示将从父类那里继承(复制)来成员变量和成员方法(不含私有)
单继承
    语法:
    class 类名(父类名):
        类内容体

多继承
Pthon中类之间也支持多继承,即一个类,可以继承多个父类。
语法:
class 类名(父类名1,父类名2,....):
    类内容体

复写和使用父类成员
复写:
子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。
即:在子类中重新定义同名的属性和方法即可。

调用父类同名成员
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员

如果需要使用被复写的父类成员,需要特殊的调用方式:
方式1:
调用父类成员
    使用成员变量:父类名.成员变量
    使用成员方法:父类名.成员方法(self)

方式2:
调用父类成员
    使用成员变量:super().成员变量
    使用成员方法:super().成员方法()
注:只能在子类内部调用父类的同名成员。子类的类对象直接调用会调用子类复写的成员。

8.类型注解:

类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式说明)。
功能:帮助第三方IDE工具(Pycharm)对代码进行类型推断,协作做代码提示,帮助开发者自身对变量进行类型注解。

语法:
(1)、为变量设置类型注解:
    语法: 变量:类型
    除了使用变量:类型,这种语法做注解外,也可以在注释中进行类型注解
    语法:type:类型

类型注解主要功能在于:
    1、帮助第三方IDE工具对代码进行类型推断,协助做代码提示
    2、帮助开发者自身对变量类型注解(备注)
类型注解并不会真正对类型做验证和判断。也就是,类型注解仅仅是提示性的,不是决定性的。

(2)、函数(方法)的类型注解
函数和方法的形参类型注解语法:
def 函数(方法)名(形参名:类型,形参名:类型,....)
    pass

函数和方法的返回值类型注解语法:
def  函数(方法)名(形参名:类型,形参名:类型,....) -> 返回值类型:
    pass

 (3)、Union类型
语法:
Union[类型,....,类型],可以定义联合类型注解
注:Union联合类型注解,在变量中、函数、方法中、形参列表、返回值中均可使用。

9.多态:

多态:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。
同样的行为(函数/方法),传入不同的对象,得到不同的状态。

多态常作用于在继承关系上:
    1、函数(方法)形参声明接收父类对象
    2、实际传入父类的子类对象进行工作
即:
    1、以父类做定义声明。
    2、以子类做实际工作。
    3、用以获得同一行为,不同状态。


抽象类(接口):
观察发现,父类Animal的speak方法是空实现的(每个动物叫声都不同)
这种设计的含义是:
    1、父类用来确定有哪些方法
    2、具体方法实现,由子类自行决定
这种写法,就叫抽象类(也称之为:接口)

抽象类:含有抽象方法的类,称之为抽象类
抽象方法:方法体是空实现的(pass)称之为抽象方法

10.正则表达式:

正则表达式:是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。

re模块:
正则的三个基础方法:
python正则表达式,使用re模块,并基于re模块中的三个基础方法来做匹配。
1、match
语法格式:re.match(匹配规则,被匹配的字符串)
从被匹配字符串开头进行匹配,匹配成功返回匹配对象(包含匹配的信息),匹配不成功返回空。

2、search
语法格式:re.search(匹配规则,被匹配的字符串)
搜索整个字符串,找出匹配的。从前向后,找到第一个后,就停止,不会继续向后。

3、findall
语法格式:re.findall(匹配规则,被匹配的字符串)
匹配整个字符串,找出全部匹配项,最终返回的是一个列表对象,如果找不到则返回[]。

更多推荐