Python魔法方法的使用 | 手把手教你入门Python之五十三

简介: Python ⾥有⼀种⽅法,叫做魔法⽅法。Python 的类⾥提供的,两个下划线开始,两个下划线结束的⽅法,就是魔法⽅法,魔法⽅法在恰当的时候就会被激活,⾃动执⾏。

上一篇:self的使用 | 手把手教你入门Python之五十二
下一篇:有关运算的魔法方法 | 手把手教你入门Python之五十四

本文来自于千锋教育在阿里云开发者社区学习中心上线课程《Python入门2020最新大课》,主讲人姜伟。

魔法方法

Python ⾥有⼀种⽅法,叫做魔法⽅法。Python 的类⾥提供的,两个下划线开始,两个下划线结束的⽅法,就是魔法⽅法,魔法⽅法在恰当的时候就会被激活,⾃动执⾏。 魔法⽅法的两个特点:

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

1.__init__⽅法

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

class Person(object):
    # 在创建对象时,会自动调用这个方法
    def __init__(self, name, age):
        print('__init__方法被调用了')
        self.name = name
        self.age = age

p = Person('zhangsan', 18)

执行结果:
image.png

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爱吃⻥

注意:

  1. __init__() ⽅法在创建对象时,会默认被调⽤,不需要⼿动的调⽤这个⽅法。
  2. __init__() ⽅法⾥的self参数,在创建对象时不需要传递参数,python解释器会把创建好的对象引⽤直接赋值给self
  3. 在类的内部,可以使⽤self来使⽤属性和调⽤⽅法;在类的外部,需要使⽤对象名来使⽤属性和调⽤⽅法。
  4. 如果有多个对象,每个对象的属性是各⾃保存的,都有各⾃独⽴的地址。
  5. ⽅法是所有对象共享的,只占⽤⼀份内存空间,⽅法被调⽤时会通过self来判断是哪个对象调⽤了实例⽅法。

2.__del__⽅法

创建对象后,python解释器默认调⽤ __init__() ⽅法;
⽽当删除对象时,python解释器也会默认调⽤⼀个⽅法,这个⽅法为 __del__() ⽅法。

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('请输⼊内容')

执行结果:
image.png

3.__str__⽅法

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

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__ ⽅法。

class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __str__(self):
        return '哈哈'

p = Person('张三',18)
print(p) # 哈哈 打印对象时,会⾃动调⽤对象的 __str__ ⽅法

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

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__。如果没有重写 __str__ ⽅法,它会⾃动来查找 __repr__ ⽅法。如果这两个⽅法都没有,会直接打印这个对象的内存地址。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def __repr__(self):
        return 'hello'



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

    def __str__(self):
        return 'good'

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

p = Person()
print(p) # good

datetime类:

import datetime

x = datetime.datetime(2020,2,24,16,17,45,200)
print(x)   # 2020-2-24 16:17:45.000200
print(repr(x))  # __repr__方法  datetime.datetime(2020, 2, 24, 16, 17, 45, 200)

5. __call__⽅法

对象后⾯加括号,触发执⾏。

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print('__call__方法被调用了')


obj = Foo() # 执⾏ __init__
obj() # 执⾏ __call__
    def __call__(self, *args, **kwargs):
        # args 是一个元组,保存(1,2)
        # kwargs 是一个字典{fn=lambda x, y: x + y}
        print('args={},kwargs={}'.format(args, kwargs))
        fn = kwargs['fn']
        return fn(args[0], args[1])

n = p(1,2,fn=lambda x, y: x + y) 
print(n)

执行结果:
image.png

总结

  1. 当创建⼀个对象时,会⾃动调⽤ __init__ ⽅法,当删除⼀个对象时,会⾃动调⽤ __del__ ⽅法。
  2. 使⽤ __str____repr__ ⽅法,都会修改⼀个对象转换成为字符串的结果。⼀般来说, __str__ ⽅法的结果更加在意可读性,⽽ __repr__ ⽅法的结果更加在意正确性(例如:datetime模块⾥的datetime类)

配套视频

相关文章
|
23天前
|
缓存 算法 数据处理
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
Python入门:9.递归函数和高阶函数
|
23天前
|
程序员 UED Python
Python入门:3.Python的输入和输出格式化
在 Python 编程中,输入与输出是程序与用户交互的核心部分。而输出格式化更是对程序表达能力的极大增强,可以让结果以清晰、美观且易读的方式呈现给用户。本文将深入探讨 Python 的输入与输出操作,特别是如何使用格式化方法来提升代码质量和可读性。
Python入门:3.Python的输入和输出格式化
|
23天前
|
机器学习/深度学习 人工智能 算法框架/工具
Python入门:1.Python介绍
Python是一种功能强大、易于学习和运行的解释型高级语言。由**Guido van Rossum**于1991年创建,Python以其简洁、易读和十分工程化的设计而带来了庞大的用户群体和丰富的应用场景。这个语言在全球范围内都被认为是**创新和效率的重要工具**。
Python入门:1.Python介绍
|
1月前
|
JSON 数据可视化 API
Python 中调用 DeepSeek-R1 API的方法介绍,图文教程
本教程详细介绍了如何使用 Python 调用 DeepSeek 的 R1 大模型 API,适合编程新手。首先登录 DeepSeek 控制台获取 API Key,安装 Python 和 requests 库后,编写基础调用代码并运行。文末包含常见问题解答和更简单的可视化调用方法,建议收藏备用。 原文链接:[如何使用 Python 调用 DeepSeek-R1 API?](https://apifox.com/apiskills/how-to-call-the-deepseek-r1-api-using-python/)
|
23天前
|
开发者 Python
Python入门:8.Python中的函数
### 引言 在编写程序时,函数是一种强大的工具。它们可以将代码逻辑模块化,减少重复代码的编写,并提高程序的可读性和可维护性。无论是初学者还是资深开发者,深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始,逐步讲解 Python 中的函数及其高级特性。
Python入门:8.Python中的函数
|
23天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
23天前
|
存储 SQL 索引
Python入门:7.Pythond的内置容器
Python 提供了强大的内置容器(container)类型,用于存储和操作数据。容器是 Python 数据结构的核心部分,理解它们对于写出高效、可读的代码至关重要。在这篇博客中,我们将详细介绍 Python 的五种主要内置容器:字符串(str)、列表(list)、元组(tuple)、字典(dict)和集合(set)。
Python入门:7.Pythond的内置容器
|
23天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
10天前
|
数据采集 人工智能 数据挖掘
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
|
2月前
|
人工智能 自然语言处理 算法
随机的暴力美学蒙特卡洛方法 | python小知识
蒙特卡洛方法是一种基于随机采样的计算算法,广泛应用于物理学、金融、工程等领域。它通过重复随机采样来解决复杂问题,尤其适用于难以用解析方法求解的情况。该方法起源于二战期间的曼哈顿计划,由斯坦尼斯拉夫·乌拉姆等人提出。核心思想是通过大量随机样本来近似真实结果,如估算π值的经典示例。蒙特卡洛树搜索(MCTS)是其高级应用,常用于游戏AI和决策优化。Python中可通过简单代码实现蒙特卡洛方法,展示其在文本生成等领域的潜力。随着计算能力提升,蒙特卡洛方法的应用范围不断扩大,成为处理不确定性和复杂系统的重要工具。
95 21

热门文章

最新文章