一、初识对象
二、成员方法
三、类和对象
四、构造方法
五、其它内置方法
六、封装
七、继承
八、类型注解
九、多态
面向对象概念
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法组织成对象。对象是具有特定属性和行为的实体,而类是对象的模板,用于定义对象的属性和行为。
以下是面向对象编程的一些关键概念:
- 类(Class):
- 类是一种用户定义的数据类型,它定义了对象的属性和方法。类是对象的蓝图或模板。例如,可以有一个
Person
类,用于表示人的属性和行为。
- 类是一种用户定义的数据类型,它定义了对象的属性和方法。类是对象的蓝图或模板。例如,可以有一个
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def greet(self):
print(f"Hello, my name is {self.name} and I am {self.age} years old.")
- 对象(Object):
- 对象是类的实例,是具体存在的数据实体。在上面的例子中,可以创建
Person
类的对象,如person1
和person2
。
- 对象是类的实例,是具体存在的数据实体。在上面的例子中,可以创建
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)
- 封装(Encapsulation):
- 封装是将数据和操作数据的方法捆绑在一起的概念。在类中,封装允许将属性和方法封装在类的内部,外部只能通过类的接口来访问。
# 使用对象的方法
person1.greet()
- 继承(Inheritance):
- 继承是一种创建新类的机制,新类可以继承现有类的属性和方法。继承允许代码重用,并支持创建层次结构。
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def study(self):
print(f"{self.name} is studying.")
- 多态(Polymorphism):
- 多态允许使用相同的接口处理不同类型的对象。在面向对象编程中,多态性使得可以使用基类的接口来处理派生类的对象。
def introduce(person):
person.greet()
introduce(person1)
introduce(Student("Charlie", 22, "12345"))
这些概念共同构成了面向对象编程的基础。通过面向对象编程,可以更清晰地组织和设计代码,提高代码的可维护性和可复用性。
一、初识对象
使用对象完成数据组织的思路
-
生活中或是程序中,我们都可以使用设计表格、生产表格、填写表格的形式组织数据
-
进行对比,在程序中:
- 设计表格,称之为:设计类(class)
- 打印表格,称之为:创建对象
- 填写表格,称之为:对象属性赋值
让我们更详细地解释一下这个比喻:
-
设计表格(设计类):
- 在生活中,设计表格就是规划你的数据表的结构,定义了表格中每一列的名称和数据类型。在程序中,这对应于设计类。类是一种数据结构,它定义了一组属性(数据成员)和方法(函数成员),描述了对象的特征和行为。
-
打印表格(创建对象):
- 打印表格是指在表格的基础上创建一份具体的记录。在程序中,这对应于创建对象。对象是类的实例,具体化了类的结构,拥有类定义的属性和方法。创建对象的过程称为实例化,通过这个过程,我们可以在程序中使用类定义的功能。
-
填写表格(对象属性赋值):
- 填写表格是指向表格的每一列添加具体的数据。在程序中,这对应于为对象的属性赋值。对象的属性是类定义的变量,它们存储对象的状态信息。通过为对象属性赋值,我们将具体的数据存储到对象中。
举个简单的例子,比如有一个类定义:
class Student:
def __init__(self, name, age, grade):
self.name = name
self.age = age
self.grade = grade
def display_info(self):
print(f"Name: {self.name}, Age: {self.age}, Grade: {self.grade}")
这个类描述了学生的特征(姓名、年龄、成绩)和一个方法用于显示学生信息。现在,我们可以创建该类的对象并为对象的属性赋值:
# 创建学生对象
student1 = Student("Alice", 20, "A")
# 打印学生信息
student1.display_info()
在这个例子中,Student
类就好比设计表格,student1
对象就相当于打印表格,而为 student1
对象的属性赋值(例如,name
、age
、grade
)就是填写表格。
这种比喻使得面向对象编程的概念更加直观,帮助初学者更容易理解类、对象和属性的概念。
二、成员方法
- 类的定义和使用语法
- 成员变量和成员方法
- self关键字的作用
1、类的定义和使用语法
类的定义和使用
2、成员变量和成员方法
- 类中定义的属性(变量),我们称之为:成员变量
- 类中定义的行为(函数),我们称之为:成员方法
成员方法的定义语法
3、self关键字的作用
- 表示类对象本身的意思
- 只有通过self,成员方法才能访问类的成员变量
- self出现在形参列表中,但是不占用参数位置,无需理会
注意事项
三、类和对象
- 使用类描述现实世界事物的思想
- 类和对象的关系
- 什么是面向对象
1、使用类描述现实世界事物的思想
现实世界的事物和类
2、类和对象的关系
类和对象之间的关系是面向对象编程中的核心概念。让我们更详细地解释一下:
-
类(Class):
- 类是一种抽象的数据类型,它定义了一组属性和方法。这些属性描述了类的状态,而方法描述了类的行为。类是一个模板或蓝图,它定义了如何创建对象。在编程中,类通常包括构造函数(用于创建对象)、属性(数据成员)和方法(函数成员)等。
-
对象(Object):
- 对象是类的实例,它是根据类定义创建的具体实体。对象具有类定义的属性和方法,并可以进行特定的操作。对象是类的具体化,它占用内存并存在于计算机的运行时环境中。通过创建对象,我们可以在程序中使用类的功能。
-
关系:
- 类是对象的模板,而对象是类的实例。一个类可以有多个对象,每个对象都有相同的属性和方法,但它们的具体值可以不同。类定义了对象的共同特征,而对象则是类的具体实现。
-
示例:
- 假设有一个类
Car
,该类具有属性(例如,颜色、型号)和方法(例如,启动、加速)。通过这个类,我们可以创建多个具体的汽车对象,每辆汽车都有自己的颜色和型号,并可以执行启动和加速等操作。
- 假设有一个类
class Car:
def __init__(self, color, model):
self.color = color
self.model = model
def start(self):
print(f"The {self.color} {self.model} is starting.")
def accelerate(self):
print(f"The {self.color} {self.model} is accelerating.")
# 创建两个Car对象
car1 = Car("Red", "Sedan")
car2 = Car("Blue", "SUV")
# 调用对象的方法
car1.start()
car2.accelerate()
在这个例子中,Car
类是一个模板,car1
和 car2
是这个类的两个不同的对象。每个对象都有自己的颜色和型号,并可以执行类定义的方法。
总的来说,类是对对象的抽象,而对象是类的实例。通过类,我们可以定义一种数据类型,然后通过创建对象,我们可以在程序中使用这个数据类型的具体实例。
3、什么是面向对象
在程序中通过类来描述
基于类创建对象
总结
-
现实世界的事物由什么组成?
- 属性
- 行为
类也可以包含属性和行为,所以使用类描述现实世界事物是非常合适的
-
类和对象的关系是什么?
类是程序中的“设计图纸”
对象是基于图纸生产的具体实体 -
什么是面向对象编程?
面向对象编程就是,使用对象进行编程。
即,设计类,基于类创建对象,并使用对象来完成具体的工作
四、构造方法
使用构造方法向成员变量赋值
属性(成员变量)的赋值
构造方法
构造方法注意事项
总结
- 构造方法的名称是:
init,注意init前后的2个下划线符号 - 构造方法的作用:
- 构建类对象的时候会自动运行
- 构建类对象的传参会传递给构造方法,借此特性可以给成员变量赋值
- 注意事项:
- 构造方法不要忘记self关键字
- 在方法内使用成员变量需要使用self
五、其它内置方法
几种常用的类内置方法
魔术方法
str 字符串方法
lt 小于符号比较方法
直接对2个对象进行比较是不可以的,但是在类中实现__lt__方法,即可同时完成:小于符号 和 大于符号 2种比较
le 小于等于比较符号方法
eq 比较运算符实现方法
总结
六、封装
1、封装的概念
面向对象的三大特性
面向对象编程,是许多编程语言都支持的一种编程思想。
简单理解是:基于模板(类)去创建实体(对象),使用对象完成功能开发。
面向对象包含3大主要特性:
- 封装
- 继承
- 多态
封装
对用户隐藏的属性和行为
2、私有成员的使用
私有成员
使用私有成员
总结
- 封装的概念是指?
将现实世界事物在类中描述为属性和方法,即为封装。 - 什么是私有成员?为什么需要私有成员?
现实事物有部分属性和行为是不公开对使用者开放的。同样在类中描述属性和方法的时候也需要达到这个要求,就需要定义私有成员了 - 如何定义私有成员?
成员变量和成员方法的命名均以__作为开头即可 - 私有成员的访问限制?
- 类对象无法访问私有成员
- 类中的其它成员可以访问私有成员
七、继承
- 继承的基础语法
- 继承的概念
- 继承的使用方式
- pass关键字的作用
- 复写和使用父类成员
- 复写父类成员的语法
- 如何在子类中调用父类成员
1、继承的基础语法
继承的引出
单继承
多继承
多继承注意事项
总结
- 什么是继承?
继承就是一个类,继承另外一个类的成员变量和成员方法
语法:
子类构建的类对象,可以- 有自己的成员变量和成员方法
- 使用父类的成员变量和成员方法
- 单继承和多继承
单继承:一个类继承另一个类
多继承:一个类继承多个类,按照顺序从左向右依次继承
多继承中,如果父类有同名方法或属性,先继承的优先级高于后继承 - pass关键字的作用是什么
pass是占位语句,用来保证函数(方法)或类定义的完整性,表示无内容,空的意思
2、复写和使用父类成员
复写
调用父类同名成员
总结
- 复写表示:
对父类的成员属性或成员方法进行重新定义 - 复写的语法:
在子类中重新实现同名成员方法或成员属性即可 - 在子类中,如何调用父类成员
注意:只可以在子类内部调用父类的同名成员,子类的实体类对象调用默认是调用子类复写的
八、类型注解
1、变量的类型注解
为什么需要类型注解
当我们调用方法,进行传参的时候(快捷键ctrl + p弹出提示):
为什么内置模块random
的方法可以提示类型
自己定义的就不可以?
因为PyCharm无法通过代码
确定应传入什么类型
我们需要使用类型注解
类型注解
Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:
- 帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
- 帮助开发者自身对变量进行类型注释
支持:
- 变量的类型注解
- 函数(方法)形参列表和返回值的类型注解
变量的类型注解语法
类型注解的语法
类型注解的限制
总结
- 什么是类型注解,有什么作用?
在代码中涉及数据交互之时,对数据类型进行显式的说明,可以帮助:- PyCharm等开发工具对代码做类型推断协助做代码提示
- 开发者自身做类型的备注
- 类型注解支持:
- 变量的类型注解
- 函数(方法)的形参和返回值的类型注解
- 变量的类型注解语法
- 语法1: 变量: 类型
- 语法2: 在注释中,# type: 类型
- 注意事项
类型注解只是提示性的,并非决定性的。数据类型和注解类型无法对应也不会导致错误
2、函数(方法)的类型注解
为函数(方法)形参进行类型注解
为函数(方法)返回值进行类型注解
总结
- 函数(方法)可以为哪里添加注解?
- 形参的类型注解
- 返回值的类型注解
- 函数(方法)的类型注解语法?
注意,返回值类型注解的符号使用:->
3、Union类型
使用Union进行联合类型注解
总结
- 什么是Union类型?
使用Union可以定义联合类型注解 - Union的使用方式
- 导包:
from typing import Union
- 使用:Union[类型, …, 类型]
- 导包:
九、多态
多态的概念
抽象类(接口)的编程思想
总结
- 什么是多态?
多态指的是,同一个行为,使用不同的对象获得不同的状态。
如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态 - 什么是抽象类(接口)
包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法 - 抽象类的作用
多用于做顶层设计(设计标准),以便子类做具体实现。
也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法
并配合多态使用,获得不同的工作状态。