Python(十一)-__init__()方法,__str__()方法,__del__()方法

目录

魔法方法

无参__init__()方法

有参__init__()方法

__str__()方法

__del__()方法


魔法方法

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

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

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

# 魔法方法语法:

__魔法方法名__()

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

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

无参__init__()方法

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

例如

给车设置对象,直接获取属性结果

class Car(object):
    def __init__(self):
        print(f"调用 car.__init__ 初始化的魔术方法 ----- {id(self)}")
        self.brand = "坦克 700"
        self.price = 500000

    def show(self):
        return f"品牌: {self.brand}, 价位: {self.price}"

if __name__ == '__main__':
    c1 = Car()
    print(id(c1))
    print(c1.show())
    print("--------------------------------------")

    c2 = Car()
    c2.brand = "五菱宏光"
    c2.price = 60000

    print(id(c2))
    print(c2.show())
    print("--------------------------------------")

有参__init__()方法

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

 例如

直接在创建车对象,初始化设定品牌,和价位,在类外部直接获取对象属性值

class Car(object):
    def __init__(self, brand, price):
        print(f"调用 car.__init__ 初始化的魔术方法 ----- ")
        self.brand = brand
        self.price = price

    def show(self):
        return f"品牌: {self.brand}, 价位: {self.price}"

if __name__ == '__main__':
    c1 = Car("比亚迪 汉", 210000)
    print(c1.show())
    print("--------------------------------------")

    c2 = Car("吉利 星越", 160000)
    print(c2.show())
    print("--------------------------------------")

__str__()方法

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

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

(2)十六进制数 0x45AC6

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

例如

class Car(object):
    def __init__(self):
        print(f"调用 car.__init__ 初始化的魔术方法 ----- {id(self)}")
        self.brand = "坦克 700"
        self.price = 500000

    # def __str__(self):
    #     return f"品牌: {self.brand}, 价位: {self.price}"

    def __str__(self):
        return f"品牌: {self.brand}, 价格: {self.price}"


if __name__ == '__main__':
    c1 = Car()
    print(id(c1))
    print(c1) # 旧: <__main__.Car object at 0x0000017A054C6970> 新: 打印 __str__返回的结果
    print(c1.__str__()) # <__main__.Car object at 0x0000017A054C6970>
    print("--------------------------------------")

    c2 = Car()
    c2.brand = "五菱宏光"
    c2.price = 60000

    print(id(c2))
    print(c2) # 旧: <__main__.Car object at 0x0000017A054C6970> 新: 打印 __str__返回的结果
    print(c2.__str__()) # <__main__.Car object at 0x0000017A054C6970>

__del__()方法

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

例如

# del 魔术方法: 当对象被销毁时才会执行

import gc
class Conn(object):
    def __init__(self, host, port, user, password):
        self.host = host
        self.port = port
        self.user = user
        self.password = password

    def __str__(self):
        return '%s:%s:%s:%s' % (self.host, self.port,self.user, self.password)

    def __del__(self):
        print(f"当前对象: {self.__str__()} 被销毁了")

if __name__ == '__main__':
    c1 = Conn('192.168.127.12', '8080', 'admin', '123456')

    print(c1)
    del c1  # 销毁c1对象
    gc.collect()

然而,Python的垃圾回收机制并不保证__del__方法一定会被调用,因为Python使用引用计数来管理内存。只有当对象的引用计数降到0时,对象才会被销毁,并且__del__方法才会被执行。

这里是你的代码的执行流程:

  1. 创建Conn类的实例c1
  2. 打印c1对象。
  3. 使用del c1删除对c1的引用,这使得c1的引用计数减1。
  4. 调用gc.collect()进行垃圾回收,这会清理掉引用计数为0的对象。
  5. 如果c1的引用计数确实为0,__del__方法会被调用,打印出销毁信息。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows下载Redis

1.下载地址 Releases tporadowski/redis GitHub 下载后&#xff0c;将压缩包解压到你的文件夹即可。&#xff08;此时&#xff0c;redis已经完成安装&#xff09; 2.使用 2.1双击redis.server.exe即可启动&#xff08;启动redis服务端&#xff09;&#xff08;或者在当前目…

软件工程pipeline梳理

文章目录 软件工程pipeline梳理为什么需要梳理软件工程的pipeline软件工程pipeline的概念与注意点软件工程pipeline中的最大挑战rethink相关资料 软件工程pipeline梳理 为什么需要梳理软件工程的pipeline 反思自己日常工作中的认知和行为。以算法/软件工程师为代表的技术工种往…

Ubuntu有关redis的命令

防火墙&#xff1a; systemctl status firewalld systemctl stop firewalld systemctl disable firewalld.service ifconfig查看ip地址 redis.conf在/etc/redis下&#xff0c;但是得sudo -i进入root模式 进入/etc/redis下开启redis-server服务 查看6379端口是否可以访问 net…

RabbitMQ篇(基本介绍)

目录 一、简介 二、作用 三、AMQP协议 1. 简介 2. 核心概念 四、工作原理 五、工作模式 1. 普通模式 2. Worker模式 3. PubSub模式 4. Rounting模式 5. Topic模式 6. RPC模式 7. Publisher Confirms模式 六、基本结构 七、常见五个角色 一、简介 RabbitMQ 是一…

浅谈2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者

目录 1.概述 1.1. 跨学科的融合 1.2. 推动科学研究的工具 1.3. 对科学界的激励 1.4. 技术的社会影响 2.机器学习与神经网络的发展前景 2.1.具体应用与作用 2.1.1. 医疗健康 2.1.2. 金融 2.1.3. 制造业 2.1.4. 交通与物流 2.1.5. 零售 2.2.未来展望 2.3.科学研究与…

基于opencv的人脸闭眼识别疲劳监测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

VS新建项目默认路径设置

Visual Studio 中打开菜单 “工具”→“选项”→项目和解决方案 →“位置” 标签。“项目位置” 一栏就是设置新建项目默认路径的地方。 新建项目即可 到设置路径。

使用three.js 实现一个 马赛克得 shader

使用three.js 实现一个 马赛克得 shader 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idmosaicShader 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-cesium-example…

计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用36-人工智能时代计算机视觉技术在电力系统中的应用。本文综述了人工智能时代计算机视觉技术在电力系统中的应用。文章首先介绍了项目背景&#xff0c;随后详细阐述了计算机视觉技术的模型、技术原理…

嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为&#xff1a;FreeRTOS 任务通知篇 任务通知简介 1、任务通知介绍 答&#xff1a; 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需要另外创建一个结构体&#xff0c…

基于Java实现(APP)智能停车场管理系统

移动应用开发系统设计说明书&#xff08;智能停车场管理系统&#xff09; 服务集成流程详细设计 实现功能 序号功能点1新增用户2注册用户3修改场地信息4列出场地信息5新增认证车辆6列出认证车辆7删除认证车辆8车辆进入信息录入9停车记录列表展示10出停车场信息录入 参数说明…

力扣HOT100合集

力扣HOT100 - 1. 两数之和 解题思路&#xff1a; 解法一&#xff1a;暴力 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i)for (int j i 1; j < n; j) {if (target nums[i] nums[j])return new int[] …

k8s的安装和部署

配置三台主机&#xff0c;分别禁用各个主机上的swap&#xff0c;并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

数据库迁移中的权限问题及解决方法——以Error 1142为例

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

重学SpringBoot3-集成Redis(十一)之地理位置数据存储

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;十一&#xff09;之地理位置数据存储 1. GEO 命令简介2. 项目环境配置2.1. 依赖引入2.2. Redis 配置 3. GEO 数据存储和查询实现3…

【机器学习】——决策树以及随机森林

文章目录 1. 决策树的基本概念与结构1.1 决策树的构建过程 2. 决策树的划分标准2.1 信息增益&#xff08;Information Gain&#xff09;2.2 信息增益比&#xff08;Information Gain Ratio&#xff09;2.3 基尼指数&#xff08;Gini Index&#xff09;2.4 均方误差&#xff08;…

使用 Blazor 和 Elasticsearch 构建搜索应用程序

作者&#xff1a;来自 Elastic Gustavo Llermaly 了解如何使用 Blazor 和 Elasticsearch 构建搜索应用程序&#xff0c;以及如何使用 Elasticsearch .NET 客户端进行混合搜索。 在本文中&#xff0c;你将学习如何利用 C# 技能使用 Blazor 和 Elasticsearch 构建搜索应用程序。我…

解决新版Android studio不能连接手机的问题

我要说的是一个特例&#xff0c;装了22年的版本AS可以正常连接手机&#xff0c;装了23年以后新版本&#xff0c;AS不能正常连接手机了&#xff0c;但是在CMD控制台可以正常的执行adb命令&#xff0c;并且CMD和AS都是指向D:\android_sdk\platform-tools\adb.exe 一、 为什么会出…

ChatGPT完成论文润色的提示词分享

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在论文写作的最后阶段&#xff0c;润色是确保文章质量的重要步骤。无论是语法检查、句式优化&#xff0c;还是提升语言的连贯性和一致性&#xff0c;润色都能显著提高论文的专业性与可读…

openstack-swift.18421165

对象存储 swift 对象存储 是一种用于存储和管理大量数据的系统。类似于一个超大云盘。可以存储各种文件。&#xff08;照片&#xff0c;视频&#xff0c;文档等等&#xff09;。与传统的文件存储不同&#xff0c;对下个存储不关心文件的目录结构和层级关系&#xff0c;而是将每…