面向对象基础
Created|Updated
|Post Views:
面向对象和面向过程
编程思想
就是人们利用计算机来解决问题的思维.
分类
面向过程
它是一种编程思想, 强调的是以 步骤(过程) 为基础完成各种操作.
面向对象
参考思路: 概述, 思想特点, 举例, 总结
它是一种编程思想, 强调的是以 对象 为基础完成各种操作, 它是基于 面向过程的.
说到面向对象, 不得不提的就是它的三大思想特点:1. 更符合人们的思考习惯. 2. 把复杂的事情简单化. 3. 把人们(程序员)从执行者变成指挥者.举例: 越符合当时的场景越好, 例如: 买电脑, 洗衣服…
总结: 万物接对象.
面向对象特征介绍
三大特征
- 封装
- 继承
- 多态
封装简介
概述
就是隐藏对象的属性和实现细节, 仅对外提供公共的访问方式.
举例
- 电脑, 手机, 函数, 类 = 属性 + 行为
好处
提高代码的安全性. (私有化)
提高代码的复用性. (函数)
继承
概述
子类继承父类的成员, 例如: 属性, 行为等.
大白话: 子承父业.好处
提高代码的复用性.
多态
概述
大白话: 同一个事物在不同时刻表现出来的不同状态, 形态.
专业版: 同1个函数, 接收不同的对象, 有不同的效果。
入门案例_汽车类
1 | """ |
self关键字介绍
案例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46"""
self关键字:
概述:
代表本类当前【对象】的引用,谁(哪个对象)调用,self就代表谁
作用:
用于实现函数【区分不同对象】
总结:大白话
1:如果你是C1对象,那么self值,代表C1,如果C2调用的话,self值就代表C2
2:函数内部都一个self,哪个对象调用,我的self就代表谁
同学问问题:
张三的老师在给张三解决问题 李四的老师在给李四解决问题
总结: 在类内 和 类外方法的调用
1:在类内, 访问类中的行为(函数),通过self.的方式进行访问
2:在类外 ,访问类中的行为(函数),通过对象名.函数进行访问
"""
# 1、类的定义
class Car :
# 属性 和行为
def run(self):
print(f"{self}跑起来了")
def work(self):
print(f"我是work函数,我的self值是:",{self})
#我想在work里面调用run
# run() 在类内访问类中的函数(行为)必须使用self.方式
self.run() # = 本类当前对象的引用
# 2、类的调用
c1 = Car()
print(f"C1对象:", {c1}) # 0x000001BC70B8B640
c1.run() # 0x000001BC70B8B640
print("*"*10)
c1.work()
# 3.定义一个新的对象
print("-" * 24)
c2 = Car()
print(f"C2对象:", {c2}) # 0x000002B8B275B250
c2.run() # 0x000002B8B275B250
# 4.小结:c1和c2打印的值不同 ,因为他们是不同的对象。self代表的c1 和c2
# 当c1调用的时候self就代表c1 当c2调用的时候self就代表c2
入门案例_手机类
1 | """ |
类外_获取和设置对象的属性

1 | """ |
类内_获取对象的属性
1 | """ |
魔法方法之init方法
图解

案例1: 无参数版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42"""
魔法方法:
Python内置函数,在满足特点的场景下,会被自动调用
场景魔法方法:
__init__ 在(每次)创建对象的时候,会自动触发该类__init__()函数
__str__
__del__
"""
# 给车这个对象默认设置color(颜色)和number(轮胎数)为黑色、3个轮胎。
#1.定义类
class Car:
# 函数 、方法、 行为
def __init__(self):
print("我是无参init魔法方法")
self.color='黑色'
self.number=3
def show(self):
print(f"颜色{self.color} , 轮胎数{self.number}")
# 演示:就是每创建一次对象,调用一次init方法
# 2.创建汽车类对象
c1 = Car()
# c1.__init__()
c1.show()
print("*" * 24)
c2 = Car()
#结论:在(每次)创建对象的时候,会自动触发该类__init__()函数
#演示初始化车参数 (颜色 轮胎)
# 调用
print(c1.color,c1.number)
#修改
c2.show()
print("*"*24)
c2.color='蓝色'
c2.number=4
print(c2.color,c2.number)
c2.show()案例2: 有参数版
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21"""
回顾:
__init__()魔法方法,在创建对象的时候,会被自动调用。一般用于给该类的属性做初始化
初始化:
有参数初始化:
"""
# 1、创建汽车类,并且初始化带参的方法。
class Car:
# 初始化带参数
def __init__(self, color, number):
self.color = color
self.number = number
def show(self):
print(f"颜色{self.color} 轮胎数:{self.number}")
# 2、实例化Car类的对象
c1 = Car() # __init__() missing 2 required positional arguments: 'color' and 'number'
# c1 = Car("黄色",4)
# 当带参数初始化方法出现的时候,即 在创建对象的时候。可以给对象予以初始化值,否则执行报错
# c1.show()
魔法方法之str方法
1 | """ |
魔法方法之del方法
1 | """ |
减肥案例
1 | # 例如小明同学当前体重是100kg。每当他跑步一次时, |
烤地瓜案例

1 | """ |
创建类的格式
1 | """ |
继承入门
1 | """ |
单继承演示
1 | # 一个摊煎饼的老师傅,在煎饼果子界摸爬滚打多年, |
Author: 甘虎文
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles
2023-09-12
数据结构与算法
冒泡排序_思路及代码 123456789101112131415161718192021222324252627282930313233343536373839404142"""排序算法稳定性介绍: 概述:排序算法= 把一串数据按照升序或者降序的方式进行排列 方法、思维、方式 分类: 稳定排序算法 排序后,想同元素的相对位置不发生改变 不稳定排序算法 排序后,想同元素的相对位置发生改变 冒泡排序: 原理:相邻元素两两比较,大的往后走,这样第一轮比较厚,最大值在最大索引处 重复该动作,只要排序完毕。 核心: 1:比较的总轮数 列表的长度-1 2:每轮比较的总次数 列表的长度-1-当前轮数的索引 3:谁和谁比较 ? 列表[j]和列表[j+1] 分析流程: 假设元素个数5个 ,具体如下: [5,3,4,7,2] 长度为5 比较的轮数,i...
2023-09-29
数据结构与算法1
数据结构和算法简介 数据结构 就是存储和组织数据的方式, 分为: 线性结构 和 非线性结构 算法 就是解决问题的思路和发放, 它具有独立性, 即: 它不依赖语言, 而是解决问题的思路. Java能做, Python也能做. 特性 有输入, 有输出, 有穷性, 确定性, 可行性. 如何衡量算法的优劣 ==大O标记法,== 即: 将次要条件都省略掉, 最终形成1个表达式. **主要条件:**随着问题规模变化而==变化==的. **次要条件:**随则问题规模变化而==不变==的. 最优和最坏时间复杂度 如非特殊说明, 我们考虑的都是 最坏时间复杂度, 因为它是算法的一种保证. 而最优时间复杂度是算法的 最理想, 最乐观的状况, 没有太大的参考价值. 常见的时间复杂度如下 从最优到最坏分别是: O(1) -> O(logn) -> O(n) -> O(n logn) -> O(n²) -> O(n³) ...
2023-08-09
生成器_正则
多线程特点_随机性12345678910111213141516171819202122import threading# 使用多线程来模拟小明一边编写num行代码,一边听count首音乐功能实现。def coding(name, num): for i in range(num): print(f"{name}正在敲{i}行代码")def music(name, count): for i in range(count): print(f"{name}正在听{i}遍音乐")# args 元组# kwargs 字典if __name__ == '__main__': t1 = threading.Thread(target=coding, args=("小明", 100)) t2 = threading.Thread(target=music, args=("小...
2023-10-31
网络编程_进程_线程
网络编程介绍 概述 就是用来实现网络互联的 不同计算机上 运行的程序间 可以进行数据交互. 三要素 IP地址: 设备(电脑, 手机, Ipad…)在网络中的唯一标识 分类: IPV4, 4字节, 十进制. 例如: 192.168.88.100 IPV6, 8字节, 十六进制, 宣传语: 可以让地球上的每一粒沙子都有自己的IP 两个DOS命令: 查看IP: windows: ipconfig Linux, Mac: ifconfig 测试网络连接: ping ip地址 或者 域名 端口号: 程序在设备(电脑, 手机, Ipad…)上的唯一标识. 范围: 0 ~ 65535, 其中0 ~ 1023已经被系统占用或者用作保留端口, 自定义端口时尽量规避这个范围. 协议: 传输规则, 规范. 常用的协议: TCP(这个用的最多) 和 UDP TCP特点: 1.面向有连接 2.采用字节流传输数据, 理论无大小限制. 3.安全(可靠)...
2023-05-02
闭包_装饰器_深浅拷贝
闭包背景介绍12345678910111213141516171819"""案例目的: 引出闭包相关知识点"""# 定义一个函数用于保存变量10,然后调用函数返回值变量并重复累加数值,观察效果。def func(): num = 10 return numnum = func()print(num + 1) # 11 想要结果是 11print(num + 1) # 11 vs 12print(num + 1) # 11 vs 13# 你会发现无法实现累加!那么如何实现累加呢!! 闭包 闭包入门 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758# 定义一个用于求和的闭包。# 其中,外部函数有参数num1,内部函数有参数num2,# 然后调用,并用于求解两数之和,观察效果"&qu...
2023-07-07
面向对象进阶
子类重写父类的功能12345678910111213141516171819202122232425262728293031323334353637# 小明掌握了老师傅和黑马的技术后,# 自己潜心钻研出一套自己的独门配方的全新摊煎饼果子技术。"""重写解释: 概念:重写也叫覆盖,即子类出现和父类【重名】的属性或者方法 。称之为重写 调用层次:就近原则 子类用子类的,没有就去找父类的,依次按照继承顺序去找其他父类"""class Master: def __init__(self): self.kongfu = "[古法煎饼果子配方]" def make_cake(self): print(f"运用{self.kongfu}制作煎饼果子")class School: def __init__(self): self.kongfu = "[黑马AI煎饼果子配方]" de...