【从零学习python 】40.python魔法方法(一)

文章目录

  • 魔法方法
    • [1. `init` 方法](#1. __init__ 方法)
    • [2. `del` 方法](#2. __del__ 方法)
    • [3. `str` 方法](#3. __str__ 方法)
    • [4. `repr` 方法](#4. __repr__ 方法)
    • [5. `call` 方法](#5. __call__ 方法)
    • 进阶案例

魔法方法

Python 里有一种方法,叫做魔法方法。Python 的类里提供的,两个下划线开始,两个下划线结束的方法,就是魔法方法,魔法方法在恰当的时候就会被激活,自动执行。

魔法方法的两个特点:

  • 两侧各有两个下划线;
  • "咒语"名字已经由 Python 官方定义好,我们不能乱写。

1. __init__ 方法

__init__() 方法,在创建一个对象时默认被调用,不需要手动调用。在开发中,如果希望在创建对象的同时,就设置对象的属性,可以对 __init__ 方法进行改造。

python 复制代码
class Cat:
"""这是一个猫类"""
    def __init__(self,name):  # 重写了 `__init__` 魔法方法
        self.name = name

    def eat(self):
        return "%s爱吃鱼"%self.name
    def drink(self):
        return '%s爱喝水'%self.name

"""
tom = Cat()
TypeError: __init__() missing 1 required positional argument: 'name'
这种写法在运行时会直接报错!因为 `__init__` 方法里要求在创建对象时,必须要传递 name 属性,如果不传入会直接报错!
"""

tom = Cat("Tom")  # 创建对象时,必须要指定 name 属性的值
tom.eat()   # tom爱吃鱼

注意:

  • __init__() 方法在创建对象时,会默认被调用,不需要手动的调用这个方法。
  • __init__() 方法里的 self 参数,在创建对象时不需要传递参数,python 解释器会把创建好的对象引用直接赋值给 self
  • 在类的内部,可以使用 self 来使用属性和调用方法;在类的外部,需要使用对象名来使用属性和调用方法。
  • 如果有多个对象,每个对象的属性是各自保存的,都有各自独立的地址。
  • 方法是所有对象共享的,只占用一份内存空间,方法被调用时会通过 self 来判断是哪个对象调用了实例方法。

2. __del__ 方法

创建对象后,Python 解释器默认调用 __init__() 方法;而当删除对象时,Python 解释器也会默认调用一个方法,这个方法为 __del__() 方法。

python 复制代码
class Student:
    def __init__(self,name,score):
        print('__init__方法被调用了')
        self.name = name
        self.score = score

    def __del__(self):
        print('__del__方法被调用了')

s = Student('lisi',95)
del s
input('请输入内容')

3. __str__ 方法

__str__ 方法返回对象的描述信息,使用 print() 函数打印对象时,其实调用的就是这个对象的 __str__ 方法。

python 复制代码
class Cat:
    def __init__(self,name,color):
        self.name = name
        self.color = color

tom = Cat('Tom','white')

# 使用 print 方法打印对象时,会调用对象的 __str__ 方法,默认会打印类名和对象的地址名
print(tom)   # `<__main__.Cat object at 0x0000021BE3B9C940>`

如果想要修改对象的输出结果,可以重写 __str__ 方法。

python 复制代码
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return '哈哈'

p  = Person('张三',18)
print(p)   # 哈哈  打印对象时,会自动调用对象的 `__str__` 方法

一般情况下,我们在打印一个对象时,可能需要列出这个对象的所有属性。

python 复制代码
class Student:
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def __str__(self):
        return '姓名是:{},成绩是{}分'.format(self.name,self.score)

s = Student('lisi',95)
print(s)   # 姓名是:lisi,成绩是95分

4. __repr__ 方法

__repr__ 方法和 __str__ 方法功能类似,都是用来修改一个对象的默认打印内容。在打印一个对象时,如果没有重写 __str__ 方法,它会自动来查找 __repr__ 方法。如果这两个方法都没有,会直接打印这个对象的内存地址。

python 复制代码
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __repr__(self):
        return 'helllo'


class Person:
    def __repr__(self):
        return 'hi'

    def __str__(self):
        return 'good'


s = Student('lisi', 95)
print(s)  # hello

p = Person()
print(p)  # good

5. __call__ 方法

对象后面加括号,触发执行。

python 复制代码
class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__')


obj = Foo()  # 执行 `__init__`
obj()  # 执行 `__call__`

总结:

  • 当创建一个对象时,会自动调用 __init__ 方法,当删除一个对象时,会自动调用 __del__ 方法。
  • 使用 __str____repr__ 方法,都会修改一个对象转换成为字符串的结果。一般来说,__str__ 方法的结果更加在意可读性,而 __repr__ 方法的结果更加在意正确性(例如: datetime 模块里的 datetime 类)。

进阶案例

【Python】Python 实现猜单词游戏------挑战你的智力和运气!

【python】Python tkinter库实现重量单位转换器的GUI程序

【python】使用Selenium获取(2023博客之星)的参赛文章

【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

使用腾讯云 Cloud studio 实现调度百度AI实现文字识别

【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析

【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中

【小白必看】Python图片合成示例之使用PIL库实现多张图片按行列合成

【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

【小白必看】Python词云生成器详细解析及代码实现

【小白必看】Python爬取NBA球员数据示例

【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码

【小白必看】使用Python批量下载英雄联盟皮肤图片的技术实现

【小白必看】Python爬虫数据处理与可视化

【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

【小白必看】利用Python生成个性化名单Word文档

【小白必看】Python爬虫实战:获取阴阳师网站图片并自动保存

小白必看系列之图书管理系统-登录和注册功能示例代码

小白实战100案例: 完整简单的双色球彩票中奖判断程序,适合小白入门

使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

使用selenium爬取猫眼电影榜单数据

图像增强算法Retinex原理与实现详解

爬虫入门指南(8): 编写天气数据爬虫程序,实现可视化分析

爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

爬虫入门指南(3):Python网络请求及常见反爬虫策略应对方法

爬虫入门指南(2):如何使用正则表达式进行数据提取和处理

爬虫入门指南(1):学习爬虫的基础知识和技巧

深度学习模型在图像识别中的应用:CIFAR-10数据集实践与准确率分析

Python面向对象编程基础知识和示例代码

MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作

Python文件操作指南:编码、读取、写入和异常处理

使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出"粽" # 的投稿文章

Python多线程与多进程教程:全面解析、代码案例与优化技巧

Selenium自动化工具集 - 完整指南和使用教程

Python网络爬虫基础进阶到实战教程

Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识

Pandas数据处理与分析教程:从基础到实战

Python 中常用的数据类型及相关操作详解

【2023年最新】提高分类模型指标的六大方案详解

Python编程入门基础及高级技能、Web开发、数据分析和机器学习与人工智能

用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归

相关推荐
Chef_Chen2 分钟前
从0开始学习机器学习--Day33--机器学习阶段总结
人工智能·学习·机器学习
hopetomorrow42 分钟前
学习路之压力测试--jmeter安装教程
学习·jmeter·压力测试
hopetomorrow43 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
nuclear20111 小时前
使用Python 在Excel中创建和取消数据分组 - 详解
python·excel数据分组·创建excel分组·excel分类汇总·excel嵌套分组·excel大纲级别·取消excel分组
/**书香门第*/1 小时前
Cocos creator 3.8 支持的动画 7
学习·游戏·游戏引擎·游戏程序·cocos2d
Lucky小小吴1 小时前
有关django、python版本、sqlite3版本冲突问题
python·django·sqlite
美式小田1 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
GIS 数据栈2 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis
爱分享的码瑞哥2 小时前
Python爬虫中的IP封禁问题及其解决方案
爬虫·python·tcp/ip
猫爪笔记2 小时前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html