【Python】面向对象(专版提升2)

面向对象

  • [1. 概述](#1. 概述)
  • [2. 类和对象](#2. 类和对象)
    • [2.1 语法](#2.1 语法)
      • [2.1.1 定义类](#2.1.1 定义类)
      • [2.1.2 实例化对象](#2.1.2 实例化对象)
    • [2.2 实例成员](#2.2 实例成员)
      • [2.2.1 实例变量](#2.2.1 实例变量)
      • [2.2.2 实例方法](#2.2.2 实例方法)
      • [2.2.3 跨类调用](#2.2.3 跨类调用)
  • [3. 三大特征](#3. 三大特征)
    • [3.1 封装](#3.1 封装)
      • [3.1.1 数据角度](#3.1.1 数据角度)
      • [3.1.2 行为角度](#3.1.2 行为角度)
      • [3.1.3 案例:信息管理系统](#3.1.3 案例:信息管理系统)
        • [3.1.3.1 需求](#3.1.3.1 需求)
        • [3.1.3.2 分析](#3.1.3.2 分析)
        • [3.1.3.3 设计](#3.1.3.3 设计)
    • [3.2 继承](#3.2 继承)
      • [3.2.1 继承方法](#3.2.1 继承方法)
      • [3.2.2 内置函数](#3.2.2 内置函数)
      • [3.2.4 定义](#3.2.4 定义)
    • [3.3 多态](#3.3 多态)
      • [3.3.1 定义](#3.3.1 定义)
      • [3.3.2 重写](#3.3.2 重写)
      • [3.3.3 重写内置函数](#3.3.3 重写内置函数)

1. 概述

1.1面向过程

(1) 定义:分析出解决问题的步骤,然后逐步实现。
(2) 案例:

py 复制代码
dict_bjlz = {
"name": "八角笼中", "type": "剧情", "index": 690761
}
dict_fs = {
"name": "封神第一部", "type": "奇幻", "index": 532622
}
print("%s电影类型是%s,指数%s." %
(dict_bjlz["name"],dict_bjlz["type"],dict_bjlz["index"]))
print("%s电影类型是%s,指数%s." %
(dict_fs["name"],dict_fs["type"],dict_fs["index"]))

(3) 优点:简单直观,适合顺序按步骤执行的任务

(4) 缺点:所有字典都要重复定义键,数据与算法分离不易扩展

1.2 面向对象

(1) 定义:可以使用类将变量与函数组合成新的数据类型

(2)案例:

py 复制代码
class Movie:
	def __init__(self, name, type, index):
		self.name = name
		self.type = type
		self.index = index
	def display(self):
		print("%s电影的类型是%s,指数是%s." % (self.name, 		self.type, self.index))

bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
bjlz.display()
fs.display()

(3) 优点:将每个字典相同的键统一定义在类中,将数据与对应的操作组合在一起扩展性强

(4) 缺点:学习曲线陡峭

2. 类和对象

2.1 语法

2.1.1 定义类

(1) 代码

py 复制代码
class 类名:
	"""
		文档说明
	"""
	def __init__(self,参数):
		self.实例变量 = 参数
	
	def 实例方法(self,参数):
		pass

(2) 说明

-- 类名所有单词首字母大写.

-- init 也叫构造函数,创建对象时被调用,也可以省略。

-- self 变量绑定的是被创建的对象,名称可以随意。

2.1.2 实例化对象

(1) 代码

py 复制代码
对象名 = 类名(数据)

(2) 说明

-- 对象名存储的是实例化后的对象地址

-- 类名后面的参数按照构造函数的形参传递

2.2 实例成员

2.2.1 实例变量

(1) 语法

a. 定义:对象.变量名

b. 调用:对象.变量名

(2) 说明

a. 首次通过对象赋值为创建,再次赋值为修改.

py 复制代码
class Movie:
	pass

movie = Movie()
movie.name = "八角笼中"
movie.name = "封神第一部"

b. 通常在构造函数(_init)中创建

py 复制代码
class Movie:
	def __init__(self, name, type, index):
		self.name = name

movie = Movie("八角笼中")
print(movie.name)

(3) 每个对象存储一份,通过对象地址访问

(4) 作用:描述某个对象的数据。

(5) dict:对象的属性,用于存储自身实例变量的字典。

2.2.2 实例方法

(1) 定义

py 复制代码
def 方法名称(self, 参数):
		方法体

(2) 调用:

py 复制代码
对象.方法名称(参数)
# 不建议通过类名访问实例方法

(3) 说明

-- 至少有一个形参,第一个参数绑定调用这个方法的对象,一般命名为self。

-- 无论创建多少对象,方法只有一份,并且被所有对象共享。

(4) 作用:表示对象行为。

2.2.3 跨类调用

py 复制代码
# 写法1:直接创建对象
# 语义:老张每次创建一辆新车去
class Person:
	def __init__(self, name=""):
		self.name = name
	def go_to(self,position):
		print("去",position)
		car = Car()
		car.run()

class Car:
	def run(self):
		print("跑喽~")

lz = Person("老张")
lz.go_to("东北")


# 写法2:在构造函数中创建对象
# 语义:老张开自己的车去
class Person:
	def __init__(self, name=""):
		self.name = name
		self.car = Car()


	def go_to(self,position):
		print("去",position)
		self.car.run()

class Car:
	def run(self):
		print("跑喽~")

lz = Person("老张")
lz.go_to("东北")


# 方式3:通过参数传递
# 语义:老张用交通工具去
class Person:
	def __init__(self, name=""):
		self.name = name
	def go_to(self,vehicle,position):
		print("去",position)
		vehicle.run()

class Car:
	def run(self):
		print("跑喽~")

lz = Person("老张")
benz = Car()
lz.go_to(benz,"东北")

3. 三大特征

3.1 封装

3.1.1 数据角度

(1) 定义:将一些基本数据类型复合成一个自定义类型。

(2) 优势:

-- 将数据与对数据的操作相关联。

-- 代码可读性更高(类是对象的模板)。

3.1.2 行为角度

(1) 定义:

向类外提供必要的功能,隐藏实现的细节。

(2) 优势:

简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。

(3) 私有成员:

-- 作用:无需向类外提供的成员,可以通过私有化进行屏蔽。

-- 做法:命名使用双下划线开头。

-- 本质:障眼法,实际也可以访问。

私有成员的名称被修改为:类名_成员名,可以通过__dict__属性查看。

-- 演示

py 复制代码
class MyClass:
	def __init__(self, data):
		self.__data = data
	
	def __func01(self):
		print("func01执行了")

m01 = MyClass(10)
# print(m01.__data) # 无法访问
print(m01._MyClass__data)
print(m01.__dict__) # {'_MyClass__data': 10}
# m01.__func01() # 无法访问
m01._MyClass__func01()

3.1.3 案例:信息管理系统

3.1.3.1 需求

实现对用户信息的增加、删除、修改和查询。

3.1.3.2 分析

界面可能使用控制台,也可能使用Web等等。

(1) 识别对象:界面视图类 逻辑控制类 数据模型类

(2) 分配职责:

-- 界面视图类:负责处理界面逻辑,比如显示菜单,获取输入,显示结果等。

-- 逻辑控制类:负责存储用户信息,处理业务逻辑。比如添加、删除等

-- 数据模型类:定义需要处理的数据类型。比如用户信息。

(3) 建立交互:

界面视图对象 <----> 数据模型对象 <----> 逻辑控制对象

3.1.3.3 设计

(1) 数据模型类:UserModel

-- 数据:编号 id,姓名 name,年龄 login_id,密码 pwd

(2) 逻辑控制类:UserController

-- 数据:用户列表 list_user

-- 行为:添加用户 add_user,删除用户remove_student,修改用户update_student

(3) 界面视图类:UserView

-- 数据:逻辑控制对象controller

-- 行为:显示菜单__display_menu,选择菜单项__select_menu,入口逻辑main,

输入学生__input_users,输出学生__display_user,删除学生__delete_user,

修改学生信息__modify_user

3.2 继承

3.2.1 继承方法

(1) 语法:

py 复制代码
class 父类:
	def 父类方法(self):
		方法体

class 子类(父类):
	def 子类方法(self):
		方法体
		
儿子 = 子类()
儿子.子类方法()
儿子.父类方法()

(2) 说明:

子类直接拥有父类的方法.

(3) 演示:

py 复制代码
class Person:
	def say(self):
		print("说话")

class Teacher(Person):
	def teach(self):
		self.say()
		print("教学")
		
class Student(Person):
	def study(self):
		self.say()
		print("学习")

qtx = Teacher()
qtx.say()
qtx.teach()

xm = Student()
xm.say()
xm.study()

3.2.2 内置函数

(1) isinstance(对象, 类型)

对象是否为一种类型

(2) type(类型) == 类型

对象的类型是否是一种类型

(3) 演示

py 复制代码
# 对象 是一种 类型: isinstance(对象,类型)
# 老师对象 是一种 老师类型
print(isinstance(qtx, Teacher)) # True
# 老师对象 是一种 人类型
print(isinstance(qtx, Person)) # True
# 老师对象 是一种 学生类型
print(isinstance(qtx, Student)) # False
# 人对象 是一种 学生类型
print(isinstance(p, Student)) # False
# 是的关系
# 老师对象的类型 是 老师类型
print(type(qtx) == Teacher) # True
# 老师对象的类型 是 人类型
print(type(qtx) == Person) # False

3.2.3 继承数据

(1) 语法

py 复制代码
class 子类(父类):
	def __init__(self,父类参数,子类参数):
		super().__init__(参数) # 调用父类构造函数
		self.实例变量 = 参数

(2) 说明

子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类实例变量被正常创建。

(3) 演示

py 复制代码
class Person:
	def __init__(self, name="", age=0):
		self.name = name
		self.age = age
		
# 子类有构造函数,不会使用继承而来的父类构造函数[子覆盖了父方法,好像它不存在]
class Student(Person):
	# 子类构造函数:父类构造函数参数,子类构造函数参数
	def __init__(self, name, age, score):
		# 调用父类构造函数
		super().__init__(name, age)
		self.score = score

ts = Person("唐僧",22)
print(ts.name)
kw = Student("悟空", 23, 100)
print(wk.name)
print(wk.score)

3.2.4 定义

(1) 概念: 重用现有类的功能,并在此基础上进行扩展。

(2) 说明:子类直接具有父类的成员(共性),还可以扩展新功能。

(3) 相关知识

-- 父类(基类、超类)、子类(派生类)。

-- 父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。

-- 单继承:父类只有一个(例如 Java,C#)。

-- 多继承:父类有多个(例如C++,Python)。

-- Object类:任何类都直接或间接继承自 object 类。

3.3 多态

3.3.1 定义

(1) 字面意思:对于一种行为有不同表现形态。

(2) 概念:对于父类的一个方法,在不同的子类上有不同体现。

(3) 说明:编码时调用父类方法,运行时传递子类对象执行子类方法。

3.3.2 重写

(1) 定义:在子类定义与父类相同的方法。

(2) 作用:改变父类行为,体现子类个性。

3.3.3 重写内置函数

(1) 定义:Python中,以双下划线开头、双下划线结尾的是系统定义的成员。我们可以在自定义类中进

行重写,从而改变其行为。

(2) str 函数:将对象转换为字符串(对人友好的)

-- 演示

py 复制代码
class Movie:
def __init__(self, name, type, index):
self.name = name
self.type = type
self.index = index
def __str__(self):
print("%s电影的类型是%s,指数是%s." % (self.name, self.type, self.index))
bjlz = Movie("八角笼中","剧情",690761)
fs = Movie("封神第一部","奇幻",532622)
print(bjlz)
print(fs)

(3) 算数运算符

(4) 复合运算符重载

(5) 比较运算重载

相关推荐
冷静 包容22 分钟前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
碳苯27 分钟前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
结衣结衣.40 分钟前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐41 分钟前
C++:静态成员
开发语言·c++
TJKFYY42 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
杰哥在此1 小时前
Python知识点:如何使用Multiprocessing进行并行任务管理
linux·开发语言·python·面试·编程
小白学大数据1 小时前
User-Agent在WebMagic爬虫中的重要性
开发语言·爬虫·http
ROBIN__dyc1 小时前
C语言基本概念
c语言·开发语言
zaim13 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
学习使我变快乐3 小时前
C++:const成员
开发语言·c++