当前位置: 首页 > news >正文

程序猿大战Python——面向对象——魔法方法

什么是魔法方法?

==目标:==了解什么是魔法方法?

魔法方法指的是:可以给Python类增加魔力的特殊方法。有两个特点:

(1)总是被双下划线所包围;

(2)在特殊时刻会被自动调用,不需要开发者手动去调用。

魔法方法语法:

__魔法方法名__()

在Python中,常用的魔法方法有:

魔法方法名描述信息
__init__(self [, ...])构造器,当一个对象被初始化创建时,会被自动调用。
__str__(self)输出对象名时,若不想直接输出内存地址值,可重写str()方法。
__del__(self)当一个对象被删除或销毁时,会被自动调用。

==总结:==

(1)魔法方法的前后,总是被()包围着;==A、双下划线==;B、单下划线;

(2)注意:魔法方法会在某些特殊时刻被自动调用。

无参__init__()方法

==目标:==掌握无参__init__()方法的使用。

在Python中,当新创建一个对象时,则会自动触发__init__()魔法方法。

魔法方法名描述信息
__init__(self [, ...])构造器,当一个对象被初始化创建时,会被自动调用。

根据是否给__init__()魔法方法传递参数值,可分为:

(1)无参__init__()方法

(2)有参__init__()方法

无参__init__()方法语法:

class 类名:def __init__(self):代码...

说明:当仅需在类内部使用与初始化属性时,可以使用该方法。

例如,一起来完成:

(1)给小轿车这个对象默认设置颜色和轮胎数为:黑色、3个轮胎;

(2)创建对象后,直接获取属性结果。

# 定义Student类
# class Student:
#     def __init__(self):
#         print("执行了init...")
​
# init
# 创建对象
# stu = Student()  # 创建对象时,会自动调用Init方法
# stu.__init__()
​
# 1.定义类: 默认设置属性
class MyCar:def __init__(self):# 默认设定self.color = "黑色"self.number = 3
​def func(self):print("============================")print(f"颜色:{self.color}")print(f"轮胎数:{self.number}")print("============================")
​
# 2.在类的外部访问属性
my_car = MyCar()
# print(my_car.color)
# print(my_car.number)
​
# 3.类内部访问属性
my_car.func()

==总结:==

(1)当创建对象时,会()执行__init__()方法;A、自动调用;B、不调用;

(2)注意:建议自定义的类中,有一个__init__()魔法方法。

==休息一下,15:40继续上课。==

有参__init__()方法

==目标:==掌握有参__init__()方法的使用。

当想要在创建对象时,就设定属性值时,可以使用有参__init__()方法。语法:

class 类名:def __init__(self, 参数1, 参数2,...):代码...

说明:

(1)不需要给self传递参数值;

(2)传递参数个数的计算公式为【传递参数个数 = 定义方法后的参数总个数 - 1】。

例如,一起来完成:

(1)直接在创建车对象时,初始化设定颜色、轮胎数值;

(2)在类外部直接获取对象属性值。

# 1.定义类、方法
class Car:def __init__(self,color,number):   # 属性名会与传递的参数名名称保持一致self.color = colorself.number = number
​
​
# 2.创建对象
car = Car("黑色",4)
# 3.获取值
print(f"颜色:{car.color}")
print(f"轮胎个数:{car.number}")

==总结:==

(1)__init__()方法可以用来设置属性的默认值;

(2)注意:当要在创建对象时,直接设定属性值,则可以通过有参__init__()方法传递参数值来处理。

__str__()方法

==目标:==掌握__str__()方法的使用。

内存地址值,也称为引用。表现形式有两种:

(1)十进制数 5040624,id()函数

(2)十六进制数 0x45AC6

说明:当直接输出对象名时,默认输出的是对象的内存地址值。

当在类中定义了__str__方法,则获取的是该方法返回的数据结果。

魔法方法名描述信息
__str__(self)输出对象名时,若不想直接输出内存地址值,可重写str()方法。

__str__方法语法:

class 类名:def __str__(self):代码...return 字符串型的结果

说明:必须返回字符串型的结果。

例如,一起来完成:

(1)创建一个有两个参数的小轿车对象,直接输出对象名,观察结果;

(2)思考:在输出小轿车对象名时,如何把颜色、轮胎数显示出来?

# 1.定义类
class Car:def __init__(self,color,number):self.color = colorself.number = number
​def __str__(self):# return "颜色:"+self.colorreturn "颜色:"+self.color+",轮胎数:"+str(self.number)
​
# 2.输出对象名  -内存地址值
car = Car("白色",4)
# print(car)  # <__main__.Car object at 0x000001FBBCA72DF0>
# 3.如何显示
print(car)
# 总结
# 1.当直接输出对象名时,输出内存地址值,则表示没有重写str方法
# 2.当输出对象名不显示内存地址值, 重写了str方法

==总结:==

(1)注意:当没有重写__str__()方法时,输出对象名,则直接输出对象的()。==A、内存地址值==;B、属性名;

__del__()方法

==目标:==了解__del__()方法的使用。

当删除对象时,会自动调用__del__()方法。

魔法方法名描述信息
__del__(self)当一个对象被删除或销毁时,会被自动调用。

__del__()方法语法:

class 类名:def __del__(self):代码...

例如,一起来完成:

(1)定义一个有品牌属性的车类;

(2)创建对象后,输出属性值;

(3)再使用__del__()方法删除对象查看效果;

(4)思考:当不调用【del 对象名】,__del__()方法会自动调用执行吗?

# 1.定义类
class Car:def __init__(self,brand):self.brand = brand
​def __del__(self):print("=========__del__===========")
​
# 2.创建对象
car = Car("BMW")
# 删除 -内存
# del car   # 注释
print(car.brand)
# 3.查看del
# 注意: 为了能更方便的查看del效果, 建议使用 del xx语法

==总结:==

(1)当使用【del 对象名】时,自动调用了__del__()方法;

(2)注意:当程序执行结束时,Python垃圾回收器会自动销毁内存垃圾,此时会自动调用__del__()方法。

相关文章:

  • Gone框架介绍30 - 使用`goner/gin`提供Web服务
  • 动手学深度学习(Pytorch版)代码实践 -卷积神经网络-28批量规范化
  • QT MQTT (二)编译与集成
  • Sass 使用
  • STM32读写备份寄存器和实时时钟
  • CentOS7在2024.6.30停止维护后,可替代的Linux操作系统
  • 深入解析 iOS 应用启动过程:main() 函数前的四大步骤
  • 【开发12年码农教你】Android端简单易用的SPI框架-——-SPA
  • Spring MVC拦截器、文件上传和全局异常处理
  • Ubuntu下FastDDS的源码编译和简单测试
  • C语言小例程
  • 自动驾驶仿真Carla -ACC功能测试
  • Centos7 Mysql8.3.0 安装地址
  • 数据分析的数学概念
  • GitHub Copilot 登录账号激活,已经在IntellJ IDEA使用
  • 30秒的PHP代码片段(1)数组 - Array
  • Android系统模拟器绘制实现概述
  • FastReport在线报表设计器工作原理
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • k个最大的数及变种小结
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Promise初体验
  • sessionStorage和localStorage
  • session共享问题解决方案
  • unity如何实现一个固定宽度的orthagraphic相机
  • 大数据与云计算学习:数据分析(二)
  • ------- 计算机网络基础
  • 技术发展面试
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端面试题总结
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 因为阿里,他们成了“杭漂”
  • k8s使用glusterfs实现动态持久化存储
  • ​批处理文件中的errorlevel用法
  • # 安徽锐锋科技IDMS系统简介
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Java数据结构)ArrayList
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .Net 4.0并行库实用性演练
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 后台导出excel ,word
  • .Net 应用中使用dot trace进行性能诊断