Python匿名函数与面向对象编程核心解析:从lambda到继承多态全掌握

目录

  • 前言
  • 一、匿名函数
  • 二、面向对象
  • 2.1 语言发展
  • 2.2 面向对象和面向过程
  • 2.2.1 面向过程
  • 2.2.2 面向对象
  • 2.3 面向对象的技术点
  • 二、类的使用
  • 三、实例化对象
  • 四、访问方法
  • 4.1 可以删除、修改、添加类的属性
  • 4.2 内置函数访问属性:
  • 五、内置类属性
  • 六、类的继承
  • 6.1 单继承
  • 6.2 多继承
  • 6.3 issubclass和isinstance
  • 6.4 方法重写
  • 6.5 基础重载方法
  • 6.6 运算符重载
  • 七、多态
  • 八、模块与包


前言

书接上文

Python集合与字典操作全解析:从基础到函数应用的核心知识点与实例详解-CSDN博客文章浏览阅读820次,点赞24次,收藏16次。本文聚焦Python集合与字典的核心操作,详细解析集合的元素查找、运算方法及不可变集合frozenset的应用,结合实例展示集合去重与无序特性;针对字典的键值对结构,详细阐述创建、增删改查操作及视图方法的应用,强调键的唯一性与不可变性。函数部分探讨自定义函数的设计,涵盖参数传递方式(关键字传参、默认参数、不定长参数)、返回值处理及变量作用域问题,并通过可变/不可变类型传参的对比,揭示数据传递机制。全文以实例驱动,提供从基础到进阶的实践指导,助力开发者高效利用集合与字典优化代码逻辑。 https://blog.csdn.net/qq_58364361/article/details/146087163?fromshare=blogdetail&sharetype=blogdetail&sharerId=146087163&sharerefer=PC&sharesource=qq_58364361&sharefrom=from_link


一、匿名函数

只能使用一次,一半函数的函数体只有一句代码,并且返回值只有一个

lambda 参数 列表 : 表达式
lambda n1, n2: n1 + n2
print((lambda n1, n2: n1 + n2)(11, 22))
a = lambda n1, n2: n1 + n2
print(a(11, 22))
b = lambda n1=3, n2=6: n1 + n2
print(b())


二、面向对象

2.1 语言发展

机器语言(0 1) ------> 汇编语言 -------> 高级语言 (c:面向过程) ------>面向对象(python)


2.2 面向对象和面向过程

想喝水


2.2.1 面向过程

自己找饮水机接水喝

分析出来解决问题的步骤,然后逐步实现


2.2.2 面向对象

找个对象,让对象给你接水,喂你喝

找出解决问题的对象,然后分配职责


2.3 面向对象的技术点

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

方法:类中定义的函数。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

局部变量:定义在方法中的变量,只作用于当前实例的类。

实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

实例化:创建一个类的实例,类的具体对象。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。

对象属性行为
边牧、萨摩耶、金毛年龄、颜色、性别吃、睡
男、女年龄、肤色玩游戏、捏脚、洗浴

二、类的使用

class 类名:

类名一般首字母大写

类由三部分组成:类名、属性(数据成员)、方法(行为成员)

class Dog:"""记录宠物狗"""numbers = 0def __init__(self, name, age):self.name = nameself.age = ageDog.numbers += 1print(self.name, self.age)print(Dog.numbers)db = Dog("大白", 5)
print(db.name)
print(db.age)
hh = Dog("花花", 4)

num:变量是一个类变量,他的值在这个类的所有实例之间共享,使用Dog.num访问 


三、实例化对象

类似于函数

格式

变量名 = 类名(参数)

_init_函数也是类的构造函数或初始化方法,当创建了类的实例时,会自动调用该方法。

self:表示实例化对象,里边存放的对象的地址,在定义类时必须有self,调用的时候可以不用传参


四、访问方法

用.访问对象的属性(调用类中的方法)

class Dog:"""记录宠物狗"""numbers = 0def __init__(self, name, age):self.name = nameself.age = ageDog.numbers += 1def say(self):print("wang~~~")print(f"大家好,我的第{self.numbers}只狗叫{self.name},今年{self.age}岁")db = Dog("大白", 5)
db.say()
hh = Dog("花花", 4)
hh.say()


4.1 可以删除修改添加属性

class Dog:"""记录宠物狗"""numbers = 0def __init__(self, name, age):self.name = nameself.age = ageDog.numbers += 1def say(self):print("wang~~~")print(f"大家好,我的第{self.numbers}只狗叫{self.name},今年{self.age}岁")db = Dog("大白", 5)
db.age = 6  #修改
db.color = "white"  # 添加
del db.color  # 删除
db.say()
hh = Dog("花花", 4)
hh.say()


4.2 内置函数访问属性

getattr( ): 访问对象属性

hasattr( ):检测属性是否存在

delattr( ): 删除属性

setattr( ):设置属性;如果属性不存在创建一个属性存在则修改属性值

class Dog:"""记录宠物狗"""numbers = 0def __init__(self, name, age):self.name = nameself.age = ageDog.numbers += 1def say(self):print("wang~~~")print(f"大家好,我的第{self.numbers}只狗叫{self.name},今年{self.age}岁")db = Dog("大白", 5)
db.age = 6  #修改
print("age=", getattr(db, "age"))  #查找一下age的结果
db.color = "white"  # 添加
print("color=", getattr(db, "color"))
del db.color  # 删除
print("有color吗", hasattr(db, "color"))  #查找是否有color内容
db.color = "black"  #创建一个新属性
delattr(db, "color")  #删除属性
print("有color吗", hasattr(db, "color"))
setattr(db, "age", 8)  #修改属性
setattr(db, "color", "red")  #创建属性
print("有color吗", hasattr(db, "color"))
db.say()


五、内置类属性

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串()

__name__: 类名

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

python3.n,所有都有一个共同父类object(顶级父类)

class Dog:"""记录宠物狗"""numbers = 0def __init__(self, name, age):self.name = nameself.age = ageDog.numbers += 1def say(self):print("wang~~~")print(f"大家好,我的第{self.numbers}只狗叫{self.name},今年{self.age}岁")print(Dog.__name__)  #类名
print(Dog.__doc__)  #文档字符串,说明
print(Dog.__module__)  #模块
print(Dog.__dict__)  #类的属性
print(Dog.__bases__)  #顶级父类


六、类的继承

继承是实现代码重用的方法之一

类可以被继承,也可以继承别的类,被继承的类叫父类或者基类或超类,继承的类叫子类或派生类

子类会继承父类的所有的属性和行为,子类可以有多个父类,一个父类可以有多个子类。


6.1 单继承

一个类只有一个父类,如果子类中有和父类相同的属行为优先调用子类

class 子类名(父类)

class DaBai:"""定义父类"""num = 22def __init__(self):print("调用了父类的构造函数")def house(self):print("父类有3个窝")def NewNum(self, n):DaBai.num = nprint(f"父类现在有{DaBai.num}袋狗粮")class XiaoBai(DaBai):"""定义子类"""def __init__(self):print("调用子类构造函数")def basin(self):print("子类有2个盆")xb = XiaoBai()  # 子类实例化
xb.house()  # 调用父类的方法
xb.basin()  # 调用子类的方法
xb.NewNum(25)  # 调用父类的方法 - 设置、获取属性值


6.2 多继承

一个多个父类

如果子类多个父类相同属性方法顺序

子类 >从左向右的第一个父类>第二个>第三个

class A:@staticmethoddef pt():print("A")@staticmethoddef hobby():print("跑步")class B:@staticmethoddef pt():print("B")@staticmethoddef play():print("够级")class C(B, A):passc = C()
c.pt()
c.play()


6.3 issubclass和isinstance

issubclass判断第一个参数是否是第二个参数的子类

isinstance判断第一个参数是否是第二个参数的实例化对象

class A:@staticmethoddef pt():print("A")@staticmethoddef hobby():print("跑步")class B:@staticmethoddef pt():print("B")@staticmethoddef play():print("够级")class C(B, A):passc = C()
c.pt()
c.play()
print(issubclass(C, A))  #C是A的子类
print(issubclass(C, B))
print(issubclass(A, C))
print(isinstance(c, C))  #c是C的实例化对象
print(isinstance(c, B))
print(isinstance(c, A))


6.4 方法重写

父类方法不能满足子类需求可以子类重写父类方法

不继承A也可以

class A:def __init__(self, x, y):self.x = xself.y = ydef addxy(self):print(self.x, self.y)class B(A):def __init__(self, x, y, z):self.x = xself.y = yself.z = zdef addxy(self):print(self.x + self.y + self.z)b = B(10, 20, 30)
b.addxy()

直接调用A的init函数,直接获取x y 参数值

class A:def __init__(self, x, y):self.x = xself.y = ydef addxy(self):return self.x + self.yclass B(A):def __init__(self, x, y, z):A.__init__(self, x, y)self.z = zdef addxy(self):return A.addxy(self) + self.zb = B(3, 3, 3)
print(b.addxy())


6.5 基础重载方法

python3.x之后不支持cmp方法

_ _lt_ _小于

_ _gt_ _大于

_ _le_ _小于等于

class Cat:def __init__(self, name, age):self.name = nameself.age = agedef __lt__(self, other):print(self)print(other)return self.age < other.agehh = Cat("huahua", 2)
haha = Cat("haha", 3)
print(hh < haha)
print(hh)
print(haha)


6.6 运算符重载

使用熟悉符号执行特定操作而不是调用方法

class Cat:def __init__(self, name, age):self.name = nameself.age = agedef __lt__(self, other):return self.age < other.age# def test(self, other):#     return self.age < other.agehh = Cat("huahua", 2)
haha = Cat("haha", 3)
print(hh < haha)
# print(hh.test(haha))

__add__        +

__sub__         -

__mul__         *

__truediv__    /

__lt__            <

__gt__           >

__le__           <=

__ge__          >=


七、多态

不同的对象对同一个方法做出不同的响应,用来设计更灵活的代码,提高代码的重复使用。

例:

len()

字符串:计算字符串长度

列表、元祖:计算元素个数

在类的继承中用的方法重写就是一种实现多态的方法

python中,鸭子模型,想要一只鸭子,身边没有,但是旁边有一只鸡,这只鸡的属性和行为都特别像鸭子,比如长的像,走路也像,就把其当成鸭子来用;没有这种类型的对象,但是有一种类似的对象,就可以拿过来改一下使用。

class Cat:def say(self):print("miao~~~")class Dog:def say(self):print("wang~~~")class Duck:def say(self):print("ga~~~")cat = Cat()
dog = Dog()
duck = Duck()def fun(obj):obj.say()fun(cat)
fun(dog)
fun(duck)


八、模块与包

创建的.py文件,就是一个模块。

我们需要两个文件

先看day001

def say_fun(name):print(f"{name}说:'明天下午唱歌'")

再看day002

import day001day001.say_fun("猫猫")


总结

        本文系统讲解了Python中匿名函数lambda的语法与应用场景,其简洁的lambda 参数: 表达式结构适用于单行逻辑的快速定义,支持参数传递与默认值设置,并通过实例演示了lambda的调用方式。随后深入探讨面向对象编程的核心概念,从面向过程与面向对象的对比切入,强调对象的行为与属性封装思想,详细解析了类的定义、构造方法__init__、实例化过程及属性操作(增删改查),结合getattrsetattr等内置函数实现对属性的动态管理。通过内置类属性如__dict____doc__等揭示了类的元信息,并借助继承机制实现代码复用,涵盖单继承、多继承的方法调用顺序及issubclassisinstance的类型校验,重点阐述了方法重写的逻辑与super()的应用。进一步以运算符重载(如__lt____gt__)和鸭子类型多态为例,展示如何通过统一接口实现不同对象的行为统一性。最后简述模块与包的导入机制,通过import实现跨文件代码复用,完整覆盖Python面向对象编程的核心技术栈,为开发高效、可维护的代码提供理论支撑与实践指导。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31178.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js入门笔记2---下载安装Node.js

Node.js入门笔记2 Node.js下载并安装的步骤1.Node.js 环境的安装2. 区分 LTS 版本和 Current 版本的不同3.项目node管理版本工具4.Node.js 包管理工具5.MSI与ZIP文件格式的主要区别6. 选择好上面的内容&#xff0c;点击下载mis7. 环境配置 Node.js下载并安装的步骤 1.Node.js …

【阿里云】控制台使用指南:从创建ECS到系统诊断测评

前言 随着云计算技术的快速发展&#xff0c;越来越多的企业和开发者开始使用云服务来部署和管理应用程序。在众多云服务提供商中&#xff0c;阿里云&#xff08;Alibaba Cloud&#xff09;凭借其强大的基础设施和丰富的服务&#xff0c;成为了众多用户的首选。本文旨在介绍如何…

【Linux内核系列】:深入理解缓冲区

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz ★★★ 本文前置知识&#xff1a; 文件系统以及相关系统调用接口 输入以及输出重定向 那么在此前的学习中&#xff0c;我们了解了文件的概念以及相关的系统调用接口&#xff0c;并…

21.HarmonyOS Next CustomSlider组件步长控制教程(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 步长控制概述2. 步长基本概念2.1 什么是步长&#xff1f;2.2 步长的作用 3. 设置步长3.1 基本参数3.2 代码示例 4. 步长与范围的关系4…

如何安装mitmproxy需要的证书(CA)

双击所需要安装的证书。 这里我就为整个计算机安装证书了&#xff0c;当然也可以只为自己安装。 接着就一路下一步&#xff0c;直到需要你输入密码这一块。 这里需要知道 CA 的密码。 我这里以 mitmproxy 需要的 CA 为例。官网上写明了是需要 Blank&#xff0c;所以就直接下一…

【Linux系统编程】基本IO函数

目录 1、open 函数2、create 函数3、write 函数4、read 函数5、lseek 函数6、access 函数7、unlink 函数8、remove 函数9、fcntl 函数写锁互斥锁示例读锁共享锁示例 1、open 函数 头文件 #include<sys/types.h> #include<sys/stat.h>#include<fcntl.h>…

Rancher证书到期致使平台无法浏览故障解决

1、修改系统时间&#xff0c;停止时间滚动更新。 # 关闭ntp同步&#xff0c;防止时间自动更新回来 timedatectl set-ntp false # 修改节点时间 timedatectl set-time 2020-07-01 00:00:00 2、重启容器。 #获取容器ID rancher_server_iddocker ps -a|grep -v CONTAINER|awk {…

tcc编译器教程6 进一步学习编译gmake源代码

本文以编译gmake为例讲解如何使用tcc进行复杂一点的c代码的编译 1 简介 前面主要讲解了如何编译lua解释器,lua解释器的编译很简单也很容易理解.当然大部分c语言程序编译没那么简单,下面对前面的gmake程序进行编译. 2 gmake源码结构 首先打开之前tcc-busybox-for-win32\gmak…

数据库基本建表操作

1.登录数据库并创建数据库db_ck 创建完成后使用到我们创建的数据库。 2.创建表t_hero 根据hero属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; 创建完…

标准卷积(Standard Convolution)

标准卷积的基础操作图解&#xff1a; 卷积之后尺寸公式&#xff1a; 输入尺寸&#xff1a;WH卷积核尺寸&#xff1a;Fw​Fh​填充大小&#xff1a;P步长&#xff1a;S 输出尺寸 WoutHout可以通过以下公式计算&#xff1a; 其中[x]表示向下取整。 实例&#xff1a; 输入图像…

初阶数据结构习题【14】(4栈和队列)——225. 用队列实现栈

1. 题目描述 力扣在线OJ——225. 用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x …

使用NVM工具管理Node版本

Date: 2025.03.10 14:53:55 author: lijianzhan NVM&#xff08;Node Version Manager&#xff09;用于在同一个系统上管理多个 Node.js 版本,NVM 允许你安装、使用和切换不同的 Node.js 版本。这对于前端工作人员来说可以更方便的管理和维护不同nodejs版本的项目。 &#xff0…

vue使用slot时子组件的onUpdated执行问题

vue使用slot时子组件的onUpdated执行问题 在使用 Vue 的插槽 (slot) 功能时&#xff0c;可能会遇到一个问题&#xff1a;当父组件的任何状态更新时&#xff0c;子组件的 onUpdated 事件会被触发。这个问题在使用默认插槽时尤为明显。 为了避免这种情况&#xff0c;可以使用作用…

淘立方电商前端网站(HTML开发)源代码

一、页面展示 &#xff08;一&#xff09;欢迎界面 &#xff08;二&#xff09;首页 &#xff08;三&#xff09;登录界面 &#xff08;四&#xff09;女装界面 &#xff08;五&#xff09;女鞋界面 &#xff08;六&#xff09;商品详情页 &#xff08;七&#xff09;注册界面…

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录 1. 引言 2. StatelessWidget&#xff08;无状态组件&#xff09; 2.1 定义与特点 2.2 代码示例 3. StatefulWidget&#xff08;有状态组件&#xff09; 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…

大模型是如何工作的

近几十年来&#xff0c;人工智能经历了从基础算法到生成式AI的深刻演变。生成式AI通过学习大量数据可以创造出全新的内容&#xff0c;如文本、图像、音频和视频&#xff0c;这极大地推动了AI技术的广泛应用。常见的应用场景包括智能问答&#xff08;如通义千问、GPT&#xff09…

SSL VXN

SSL VPN是采用SSL&#xff08;Security Socket Layer&#xff09;/TLS&#xff08;Transport Layer Security&#xff09;协议来实现远程接入的一种轻量级VPN技术,其基于B/S架构&#xff0c;免于安装客户端&#xff0c;相较与IPSEC有更高的灵活度和管理性&#xff0c;当隧道建立…

【C】链式二叉树算法题2

目录 1 另一棵树的子树 1&#xff09; 题目描述 示例1&#xff1a; 示例2&#xff1a; 2&#xff09; 算法解析 3&#xff09; 代码 2 二叉树的遍历 1&#xff09; 问题描述 2&#xff09; 算法解析 3&#xff09; 代码 3 总结 1 另一棵树的子树 leetcode链接…

【Java并发】【synchronized】适合初学者体质入门的synchronized

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…

STM32---FreeRTOS消息队列

一、简介 1、队列简介&#xff1a; 队列&#xff1a;是任务到任务&#xff0c;任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09;。 FreeRTOS基于队列&#xff0c;实现了多种功能&#xff0c;其中包括队列集、互斥信号量、计数型信号量、二值信号量…