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类)

配套视频

相关文章
|
2月前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
26天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
本文将引导读者了解如何使用Python进行数据分析,从安装必要的库到执行基础的数据操作和可视化。通过本文的学习,你将能够开始自己的数据分析之旅,并掌握如何利用Python来揭示数据背后的故事。
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
58 3
|
22天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
27天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
26天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
38 7
|
28天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
42 5
|
27天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
69 3
|
30天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
161 5