Python面向对象基础与魔法方法详解

news2024/11/15 10:05:36

在这里插入图片描述

系列文章目录

  1. Python数据类型:编程新手的必修课
  2. 深入探索Python字符串:技巧、方法与实战
  3. Python 函数基础详解
  4. Python正则表达式详解:掌握文本匹配的魔法
  5. Python文件操作宝典:一步步教你玩转文件读写
  6. Python面向对象基础与魔法方法详解
  7. Python面向对象进阶:深入解析面向对象三要素——封装、继承与多态
  8. Python进阶之旅:深入理解变量作用域、垃圾回收、拷贝机制与异常处理
  9. Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
  10. 从零开始学迭代器生成器:打造高效、易读的Python代码
  11. Python进阶:深入剖析闭包与装饰器的应用与技巧
  12. PyMySQL:连接Python与MySQL的桥梁

文章目录

  • 系列文章目录
  • 前言
  • 一、面向对象
    • 面向对象和面向过程
      • 优缺点
  • 二、类与对象
    • 1.类
      • 1.1 类的介绍
      • 1.2 类的构成
      • 1.3 类的抽象
      • 1.4 类的定义
      • 1.5 定义实例方法
    • 2.对象
      • 2.1 对象的介绍
      • 2.2 对象的定义
      • 2.3 对象调用方法
      • 2.4 给对象增加属性并获取
      • 2.5 在实例方法中使用实例属性
  • 三、魔法方法
    • 概念
    • _ _init_ _()
    • _ _new_ _()
    • _ _str_ _()
    • _ _del_ _()


前言

本文主要介绍了面向对象的基础内容(类与对象)和一些常见的魔法方法。下一篇:面向对象进阶(继承、封装、多态)点这!!!

一、面向对象

面向对象和面向过程

面向对象和面向过程都是解决问题的一种思路,一种方式

# 吃火锅

# 第一种方式:在家吃   --- 面向过程    
买菜-->洗菜-->摆盘-->下菜-->-->洗锅-->扔垃圾

# 第二种方式:去店里吃   ---  面向对象
扫码--># 面向对象建立在面向过程的基础上
1、面向对象就是:把数据和对数据的操作封装在一起组成类,通过类来创建对象,通过对象之间的交互来实现程序的功能。
2、面向对象落地需要使用 “类” 和 “对象” 

优缺点

面向对象:核心就是对象,上帝式思维
	优点:上帝眼里万物皆存在,代码效率高
	缺点:无法及时准确的发现问题并解决

面向过程:核心就是过程,流水线式思维
	优点:过程中及时发现并解决问题
	缺点:大量的代码堆叠只为了实现一个简单的功能,过程中出现问题,接下来的操作无法正常执行

二、类与对象

类与对象的区别:类就是创建对象的模板

1.类

1.1 类的介绍

人类    将具有共同特征和行为的事物进行抽象,抽象出一个类
对象    类中具体的一个实例-->张三  李四  王五

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,使用这个具体的存在。一个类可以找到多个对象

1.2 类的构成

(Class) 由3个部分构成

- 类的名称:类名
- 类的属性:一组数据
- 类的方法:类提供的可以进行一定操作的方法 (行为)

特征即属性(数据)
行为即方法(对数据的操作)


人类设计,只关心3样东西:

- 事物名称(类名):(Person)
- 属性:身高(height)、年龄(age)
- 方法(行为/功能):(run)、打架(fight)

1.3 类的抽象

方法:一般名词都是类(名词提炼法)

**<1> 坦克发射3颗炮弹轰掉了2架飞机**

- 坦克--》可以抽象成 类
- 炮弹--》可以抽象成类
- 飞机-》可以抽象成类

1.4 类的定义

# 定义类
# 语法格式:
# class 类名(要继承的父类):
#     属性
#     方法

# 1.类名首字母大写,推荐使用大驼峰命名法(每一个单词首字母都大写,其余字母都小写)
# 2.要继承的父类可有可无,如果没有要继承的父类,类名后的()可以省略
# 3.object是所有类的顶级父类

# 根据是否继承object对类进行区分
# python2:
    # 新式类:继承了object类
    # 经典类:也称之为旧式类,没有object类
# python3:
    # 没有经典类与新式类区分,所有的类都是新式类;
class Person(object):
class Person():
class Person:
    pass

1.5 定义实例方法

# 定义英雄类
class Hero:

    # 在类中编写方法-->以函数的形式编写方法
    # self-->实例对象本身
    # 编写的方法称之为:实例方法
    def run(self):
        print("会跑")

2.对象

2.1 对象的介绍

某一个具体事物的存在 ,在现实世界中可以是看得见摸得着的。可以是直接使用的。

2.2 对象的定义

# 给类创建对象-->实例化对象    对象名 = 类名()
luban = Hero()
anqila = Hero()

2.3 对象调用方法

# 让实例对象调用实例方法     对象名.方法名()
luban.run()
anqila.run()

2.4 给对象增加属性并获取

# 给实例对象增加实例属性    对象名.属性名 = 属性值
luban.name = "鲁班"
luban.gender = "男"
luban.age = 6
anqila.name = "安其拉"
anqila.gender = "女"
anqila.age = 10

# 获取实例对象的实例属性     print(对象名.属性名)
print(luban.age)
print(anqila.gender)

2.5 在实例方法中使用实例属性

# 定义英雄类
class Hero:
    def info(self):
        # 想要在实例方法中使用实例属性   self.属性名
        # self--》实例对象本身
        # 如果luban对象调用info方法,self-->luban
        # 如果anqila对象调用info方法,self-->anqila
        print(f"这个英雄的姓名是{self.name},年龄是{self.age},性别为{self.gender}")

三、魔法方法

概念

魔法方法:
表象:以__开头__结尾的方法称之为魔法方法
本质:不需要手动调用,会在特定的情况下自动被调用

_ init _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight

    # 类中定义方法:计算鱼的总价  "当前这个xxx鱼,xxx元一斤,xxx斤总共需要花费xxx元"
    # 实例方法-->以函数的形式定义
    # self--》实例对象本身
    def info(self):
        # 在实例方法中使用实例属性   self.属性名
        print(f"当前这个{self.name}{self.price}元一斤,{self.weight}斤总共需要花费{self.price * self.weight}元")


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)

# 实例对象调用实例方法  对象名.方法名()
liyu.info()
jiyu.info()

_ new _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight
        print("这是我的init方法")

    # 魔法方法__new__
    # cls-->类对象本身
    # 结论:new在init前被执行
    # 作用:创建对象
    # 调用:在实例化对象的时候被调用
    def __new__(cls, *args, **kwargs):
        # __new__方法必须至少有cls参数
        # 在自己实现__new__方法时注意:new的功能:返回父类__new__出来的实例
        # 没有自己继承的父类,可以使用顶级父类object
        print("这是我的new方法")
        return object.__new__(cls)

# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)


# 注意:
1.后续编写类的时候不需要重写new方法,new方法在底层编写好了
2.当前这个案例编写new,为了理解new鱼init区别,谁先执行谁后执行,研究功能
3.new功能:只有返回父类__new__出来的实例,才能将对象创建成功(给对象开辟内存空间)
4.先执行__new__再执行__init__
5.单例模式、工厂模式需要重写new方法


`__new__`至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
`__new__`必须要有返回值,返回实例化出来的实例,这点在自己实现`__new__`时要特别注意,可以return父类`__new__`出来的实例,或者直接是object的`__new__`出来的实例
`__init__`有一个参数self,就是这个`__new__`返回的实例,`__init__`在`__new__`的基础上可以完成一些其它初始化的动作,`__init__`不需要返回值
我们可以将类比作制造商,`__new__`方法就是前期的原材料购买环节,`__init__`方法就是在有原材料的基础上,加工,初始化商品环节

_ str _()

# 定义一个鱼类  Fish
class Fish:
    # 魔法方法__init__:初始化方法
    # 作用:给实例对象增加实例属性
    # 调用:对象一旦创建成功会立马调用init
    # init方法的实参需要在 类名(实参) 的时候传递
    def __init__(self,name,price,weight):
        # 一个类有多个对象,想要给对象设置属性,不能直接写对象名,使用self代替
        # 每一个对象的属性值都不固定,属性值不能直接写死,通过传参的形式指定
        # 设置实例属性   对象名.属性名 = 属性值
        self.name = name
        self.price = price
        self.weight = weight
        print("这是我的init方法")

    # 魔法方法__str__
    # 调用:print(对象)
    # 功能:返回一个字符串
    # 作用:返回对象的描述信息
    
    def __str__(self):
        return f"当前这个{self.name}{self.price}元一斤,{self.weight}斤总共需要花费{self.price * self.weight}元"


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish("鲤鱼",5.6,9)
jiyu = Fish("鲫鱼",4,7)

# 打印对象
# 如果不重写str方法,打印对象时会得到对象的内存地址
print(liyu)
print(jiyu)

_ del _()

# 定义一个鱼类  Fish
class Fish:

    # 魔法方法__del__
    # 调用:当对象要被删除时调用
    def __del__(self):
        print(f"{self.name}被删除")


# 实例化两条鱼   鲤鱼 鲫鱼……     对象名 = 类名()
liyu = Fish()
del liyu   # 删除对象前调用del
jiyu = Fish()

# 对象及类中没有再需要使用对象的地方了-->对象无用-->触发垃圾回收机制-->对象会被作为垃圾进行销毁
# 对象在被真正删除之前调用del

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nmap的使用教程(超详细)

一、Nmap简介 Nmap Nmap是一款开源免费的网络发现&#xff08;Network Discovery&#xff09;和安全审计&#xff08;Security Auditing&#xff09;工具。软件名字Nmap是Network Mapper的简称。Nmap最初是由Fyodor在1997年开始创建的。随后在开源社区众多的志愿者参与下&…

2024电工杯数学建模B题完整论文讲解(含每一问python代码+数据)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024电工杯数学建模B题大学生平衡膳食食谱的优化设计及评价完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 …

QGIS开发笔记(二):Windows安装版二次开发环境搭建(上):安装OSGeo4W运行依赖其Qt的基础环境Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

牛客热题:滑动窗口的最大值

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;滑动窗口的最大值题目链接方法一…

AI预测福彩3D采取888=3策略+和值012路一缩定乾坤测试5月26日预测第2弹

昨天的8883大底成功命中&#xff0c;但是由于昨天杀了对子&#xff0c;结果昨天开了对子&#xff0c;导致最终与中奖号码擦肩而过。今天继续基于8883的大底&#xff0c;使用尽可能少的条件进行缩号&#xff0c;同时&#xff0c;今天将准备两套方案&#xff0c;一套是我自己的条…

【重制版】Unity Meta Quest 一体机开发(一):前期准备,Meta XR SDK导入和环境配置,配置玩家物体

文章目录 &#x1f4d5;教程说明&#x1f4d5;Meta XR SDK 介绍&#x1f4d5;前期准备⭐开启开发者模式⚡在 Meta 官网申请开发者⚡在 Meta Quest 手机 APP 开启开发者 ⭐电脑需要下载的软件⚡Meta Quest Link&#xff08;以前叫做Oculus PC客户端&#xff09;⚡Oculus ADB Dri…

Overleaf中出现文字越界、越下届、没有正确分页、换页的原因和解决方法

在使用overleaf中&#xff0c;我偶尔会遇到如标题所说的情况&#xff0c;也如图所示&#xff1a; 后来发现&#xff0c;是因为这一页前面是一个表格&#xff0c;所以怀疑是表格的格式导致的。所以让chatgpt帮我更换了表格的格式&#xff0c;成功解决问题。 对于问题可能的成因…

【C语言】10.C语言指针(1)

文章目录 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2.指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引⽤操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引⽤操作符 2.3 指针变量的⼤⼩ 3.指针变量类型的意…

docker 进入容器报错OCI runtime exec failed

今天进入docker容器的时候一直报错 OCI runtime exec failed: exec failed: unable to start container process: exec: “/bin/bash”: stat /bin/bash: no such file or directory: unknown 执行命令 docker exec -it 容器id /bin/sh 可进入

ThreadPoolExecutor线程池使用以及源码解析

文章目录 1. 引子2. 线程池源码分析2.1. 总览2.2. Executor2.3. ExecutorService2.4. AbstractExecutorService2.5. ThreadPoolExecutor构造函数核心参数阻塞队列拒绝策略核心属性线程池状态Worker 类execute() 方法addWorker() 方法runWorker() 方法getTask() 方法processWork…

【InternLM实战营第二期笔记】02:大模型全链路开源体系与趣味demo

文章目录 00 环境设置01 部署一个 chat 小模型02 Lagent 运行 InternLM2-chat-7B03 浦语灵笔2 第二节课程视频与文档&#xff1a; https://www.bilibili.com/video/BV1AH4y1H78d/ https://github.com/InternLM/Tutorial/blob/camp2/helloworld/hello_world.md 视频和文档内容基…

运算符优先级详解:从一元到布尔运算的全面指南

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、一元运算符&#xff1a;最高优先级 三、二元运算符&#xff1a;紧随其后的优…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

分布式Id/框架/发号器一文介绍

文章目录 一、分布式id介绍1、什么是分布式id2、分布式id的特点 二、UUid生成算法1、JDK UUID2、Snowflake 雪花算法3、PearFlower 梨花算法4、Mist 薄雾算法 三、常见发号器服务1、数据库1&#xff09;自增2&#xff09;号段模式 2、NoSQL 四、常见框架1、百度UIDGenerator2、…

01主动安全系统

“安全”一直是车主对车辆考核的重要指标。车辆安全可以分为从主动安全和被动安全两个方面进行分类。今天就来说说汽车主动安全系统的那些事儿。 01.什么是主动安全系统&#xff1f; 主动安全是指尽量自如地操纵控制汽车的安全系统措施。无论是直线上的制动与加速还是左右打方…

粤嵌—2024/5/21—打家劫舍(✔)

代码实现&#xff1a; int rob(int *nums, int numsSize) {if (numsSize 1) {return nums[0];}if (numsSize 2) {return fmax(nums[0], nums[1]);}int dp[numsSize];dp[0] nums[0];dp[1] fmax(nums[0], nums[1]);for (int i 2; i < numsSize; i) {dp[i] fmax(dp[i - 1…

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性&#xff0c;取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性&#xff0c;扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine&#xff0c;执行脚本语言代码&#xff0c;如JavaScript、Groovy JavaCompile…

LeetCode:78.子集

解答 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res[[]]for i in nums:res[[i]num for num in res]return res代码解释 这段代码定义了一个名为Solution的类&#xff0c;并在其中定义了一个名为subsets的方法。该方法接受一个整数列表nums作…

TOTP 算法实现:双因素认证的基石(C/C++代码实现)

双因素认证&#xff08;Two-Factor Authentication, 2FA&#xff09;扮演着至关重要的角色。它像是一道额外的防线&#xff0c;确保即便密码被窃取&#xff0c;不法分子也难以轻易突破。在众多双因素认证技术中&#xff0c;基于时间的一次性密码&#xff08;Time-Based One-Tim…

springmvc Web上下文初始化

Web上下文初始化 web上下文与SerlvetContext的生命周期应该是相同的&#xff0c;springmvc中的web上下文初始化是由ContextLoaderListener来启动的 web上下文初始化流程 在web.xml中配置ContextLoaderListener <listener> <listener-class>org.springframework.…