返回顶部
首页 > 资讯 > 后端开发 > Python >Python常用的魔法方法是什么
  • 651
分享到

Python常用的魔法方法是什么

2023-06-15 08:06:11 651人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章将为大家详细讲解有关python常用的魔法方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Python魔法方法Python的魔法方法会在特定的情况下自动调用,且他们的方法名通常被双下划

这篇文章将为大家详细讲解有关python常用的魔法方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、Python魔法方法

Python的魔法方法会在特定的情况下自动调用,且他们的方法名通常被双下划线包裹,之前我们学习的构造函数和析构函数就属于魔法方法

二、运算符重载

Python中同样有运算符重载,其实所有的运算符都是使用了对应的魔法方法来处理的对象的,魔法方法对应的操作符如下

Python常用的魔法方法是什么

我们来举一个简单的例子

class A:    def __init__(self,x):        self.x = x    def __add__(self,other):        return int(self.x)+int(other.x)a = A(3.3)b = A(5.2)print(a+b)

类似的还有反运算重载和增量复制运算,用处较少,不再解释

Python常用的魔法方法是什么
Python常用的魔法方法是什么

三、打印操作的魔法方法

__str__(self):返回值是str类型的,当我们需要以字符串的形式输出对象时(调用print时),就会自动调用该方法,举个例子

class A:    def __str__(self):        return '我真帅'a = A()print(a)# 我真帅

__repr__(self):返回值是str类型的,当我们直接在shell中输入对象名并按下回车,就会自动调用该方法,他也有和__str__一样的功能,但如果两者你都重写了,在使用print时,__str__的优先级高,__repr__是给机器看的,__str__是给人看的,举个例子

>>> class A:    def __str__(self):        return '我真帅'    def __repr__(self):        return '我是世界第一帅'>>> a = A()>>> a我是世界第一帅>>> print(a)我真帅

四、属性操作的魔法方法

  • __getattr__(self, name):定义当用户试图获取一个不存在的属性时的行为,其中name是属性名,是一个字符串,下同

  • __getattribute__(self, name):定义当该类的属性被访问时的行为,该方法默认返回该属性的值

  • __setattr__(self, name, value):定义当一个属性被设置时的行为,value是给该属性的值

  • __delattr__(self, name):定义当一个属性被删除时的行为

例如:

class A:    def __init__(self):        self.id = "Pyhon"    def __getattr__(self,name):        print(name+"这个属性不存在")    def __getattribute__(self,name):        print("我访问了"+name+"这个属性")        return super().__getattribute__(name)    def __setattr__(self,name,value):        print("将属性"+name+"置为"+value)        super().__setattr__(name,value)    def __delattr__(self,name):        print("将属性"+name+"删除了");        super().__delattr__(name)    def fun(self):        passa = A()a.namea.name = "老师"del a.namea.fun()# output:# 将属性id置为Pyhon# 我访问了name这个属性# name这个属性不存在# 将属性name置为老师# 将属性name删除了# 我访问了fun这个属性

结果可以看出,当我们访问一个属性的时候,先是调用了__getattribute__,如果该属性不存在,则再调用__getattr__

使用这几个的方法的时候,要注意不要陷入无限递归,运算符重载的时候也容易犯这种错误,例如下面的错误

class A:    def __init__(self):        self.id = "Pyhon"    def __setattr__(self,name,value):        print("将属性"+name+"置为"+value)        if(name == "id"):            self.id = valuea = A()

执行这段程序的时候将陷入无限递归,原因是在__setattr__中,直接给self对象的属性赋值,而这又会调用__setattr__方法。

所以在__setattr__中,我们通常会使用父类的__setattr__方法来给self对象的属性赋值,这不会陷入无限递归,其他几个方法和运算符重载也是同理,上面程序订正后如下

class A:    def __init__(self):        self.id = "Pyhon"    def __setattr__(self,name,value):        print("将属性"+name+"置为"+value)        if(name == "id"):            super().__setattr__(name,value)a = A()# output# 将属性id置为Pyhon

五、描述符

  • __get__(self, instance, owner):通过其他实例对象来访问该类的实例对象时会调用该方法,返回该实例对象的引用。其中instance是访问该对象的实例对象的引用,下同,owner是访问该对象的类对象

  • __set__(self, instance, value):通过其他实例对象来给该类的实例对象赋值时会调用该方法。其中value是给该对象赋的值

  • __delete__(self, instance):通过其他实例对象来删除该类的实例对象时会调用该方法

class Fit:    def __init__(self):        self.height = 180        self.weight = 80    def __get__(self,instance,owner):        print("get:",instance,owner)        return [self.height,self.weight]    def __set__(self,instance,value):        print("set:",instance,value)        self.height = value        self.weight = value/2    def __delete__(self,instance):        del self.height        del self.weight        print("delete:",instance)class Test:    fit = Fit()        t = Test()print (t.fit)t.fit = 190del t.fit# output:# get: <__main__.Test object at 0x0000023EFFA738C8> <class '__main__.Test'># [180, 80]# set: <__main__.Test object at 0x0000023EFFA738C8> 190# delete: <__main__.Test object at 0x0000023EFFA738C8>

通常情况下,上面几个魔法方法,当我们需要定义一个属性,且希望可以直接对该属性进行相应的操作,而不是通过调用方法的方式来进行操作时,我们可以定义一个该属性的类,实现上面几个魔法方法,将需要用到的属性作为其实例对象,这样就完成了,例如上面的Fit,其实就是体型类,而Test中有一个体型属性叫fit,我们在Fit中定义了一些对Fit的实例对象操作时执行的操作。

六、定制序列

  • __len__(self):定义当该类的实例对象被len()调用时的行为

  • __getitem__(self, key):定义获取该类的实例对象中指定元素的行为,也就是说执行self[key]时的行为

  • __setitem__(self, key, value):定义设置该类的实例对象中指定元素的行为,相当于self[key] = value

  • __delitem__(self, key):定义删除该类的实例对象中指定元素的新闻,相当于del self[key]

class CountList:    def __init__(self,*args):        self.values = [x for x in args]#这是一个列表推导式,把args里的元素作为values的元素        self.count = {}.fromkeys(range(len(self.values)),0)    def __len__(self):        return len(self.values)    def __getitem__(self,key):        self.count[key] += 1;        return self.values[key]c = CountList(1,3,5,7,9,11)print(c[1])print(c[1]+c[2])print(c.count)# output:# 3# 8# {0: 0, 1: 2, 2: 1, 3: 0, 4: 0, 5: 0}

该类中的count是记录对应元素被访问的次数,其他两个也差不多,不再举例了

七、迭代器

迭代器,就是提供了迭代方法的容器,而所谓的迭代方法,就是下面这两个__iter____next__
可迭代,就是提供了__iter__方法的容器,我们之前讲的字符串,列表,元组,字典,集合都是可迭代的,但他们不是迭代器,可以使用Python的内置函数iter(iterable)来获取他们相应的迭代器,而迭代器使用next(iterator)可以获取下一个元素,而这两个方法其实就是调用了迭代器的__iter____next__

  • __iter__(self):定义获取迭代器时的行为

  • __next__(self):定义获取迭代器对应的下一个元素时的行为

class Fb:    def __init__(self,n = 20):        self.a = 0        self.b = 1        self.n = n    def __iter__(self):        return self    def __next__(self):        t = self.a        self.a = self.b        self.b = t + self.b        if(self.a <= self.n):            return self.a        else:            raise StopIterationf = Fb()for i in f:    print(i,end=' ')# output:1 1 2 3 5 8 13

其中 raise 是返回一个异常,上面的程序等价于下面这个

class Fb:    def __init__(self,n = 20):        self.a = 0        self.b = 1        self.n = n    def __iter__(self):        return self    def __next__(self):        t = self.a        self.a = self.b        self.b = t + self.b        if(self.a <= self.n):            return self.a        else:            raise StopIterationf = Fb()it = iter(f)while True:    try:        i = next(it)        print(i, end=' ')    except StopIteration:        break;

这样我们就很清楚Python中for循环的原理了,先通过iter来获取迭代器对象,然后不断调用next来获取下一个元素赋值给i,直到遇到StopIteration异常

关于“Python常用的魔法方法是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Python常用的魔法方法是什么

本文链接: https://lsjlt.com/news/279126.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python常用的魔法方法是什么
    这篇文章将为大家详细讲解有关Python常用的魔法方法是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、python魔法方法Python的魔法方法会在特定的情况下自动调用,且他们的方法名通常被双下划...
    99+
    2023-06-15
  • Python魔法方法的作用是什么
    Python魔法方法是一些特殊的方法,用于在特定的情况下自动调用。它们以双下划线()开头和结尾,如init,str__等。魔法方法允...
    99+
    2023-10-23
    Python
  • python魔法方法的含义是什么
    Python中的魔法方法(Magic methods)是一些特殊的方法,它们以双下划线(__)开头和结尾,并具有特定的功能和含义。这...
    99+
    2023-10-23
    python
  • python魔术方法是什么
    这篇文章主要介绍“python魔术方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python魔术方法是什么”文章能帮助大家解决问题。一、三个内置函数@classmethod&nda...
    99+
    2023-06-26
  • 总结Python常用的魔法方法
    目录一、算数运算符的魔法方法二、反运算相关的魔法方法三、增量赋值运算四、一元操作符一、算数运算符的魔法方法 python2.2以后,对类和类型进行了统一,做法就是讲int(...
    99+
    2024-04-02
  • 详解Python常用的魔法方法
    目录一、python魔法方法二、运算符重载三、打印操作的魔法方法四、属性操作的魔法方法五、描述符六、定制序列七、迭代器一、python魔法方法 Python的魔法方法会在特定的情况下...
    99+
    2024-04-02
  • 常用的Python魔法方法有哪些
    这期内容当中小编将会给大家带来有关常用的Python魔法方法有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、算数运算符的魔法方法python2.2以后,对类和类型进行了统一,做法就是讲int()、...
    99+
    2023-06-15
  • python常用的魔法方法(双下划线)
    目录前言魔法方法__init__方法__new__方法__call__方法__str___方法__del___方法__enter__ & __exit__方法item系列方法...
    99+
    2024-04-02
  • Python中魔术方法的特点是什么
    这期内容当中小编将会给大家带来有关Python中魔术方法的特点是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python的数据类型有哪些python的数据类型:1. 数字类型,包括int(整型)、l...
    99+
    2023-06-14
  • python魔法函数是什么
    魔法函数是python中的一种高级语法,魔法函数可以在类中自定义函数,并绑定到类;使用魔法函数为类增加一些额外功能,也可以增强对象的类型。常见的魔法函数有__init__()、__str__()、__new__()、__unicode__(...
    99+
    2024-04-02
  • 聊聊Python中常见魔法方法
    ​什么是魔法方法?魔法方法(Magic Methods)是Python中的内置函数,一般以双下划线开头和结尾,例如__init__、__del__等。之所以称之为魔法方法,是因为这些方法会在进行特定的操作时会自动被调用。在Python中,可...
    99+
    2023-05-15
    代码 Python 魔法方法
  • python中有哪些常用的魔术方法
    这篇文章将为大家详细讲解有关python中有哪些常用的魔术方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比...
    99+
    2023-06-14
  • Python中的魔法方法
    python中的魔法方法是一些可以让你对类添加“魔法”的特殊方法,它们经常是两个下划线包围来命名的。Python的魔法方法,也称为dunder(双下划线)方法。大多数的时候,我们将它们用于简单的事情,例如构造函数(init)、字符串表示(s...
    99+
    2023-05-14
    Python 运算符
  • php中魔术方法是什么
    这篇文章主要介绍了php中魔术方法是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。类中的魔术方法PHP 魔术方法指的是在某些时刻会自动被...
    99+
    2024-04-02
  • Python threading模块的常用方法是什么
    本篇内容介绍了“Python threading模块的常用方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明threading.c...
    99+
    2023-06-30
  • python魔法方法 __ slots __怎么使用
    这篇文章主要讲解了“python魔法方法 __ slots __怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python魔法方法 __&nb...
    99+
    2023-07-05
  • Python基础中的魔法方法与异常处理是怎样的
    这期内容当中小编将会给大家带来有关Python基础中的魔法方法与异常处理是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一.魔法方法1.属性访问通常可以通过点(.)操作符的形式去访问对象的属性。cl...
    99+
    2023-06-25
  • Python字符串常用方法是什么
    这篇文章主要介绍了Python字符串常用方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python字符串常用方法是什么文章都会有所收获,下面我们一起来看看吧。&quo...
    99+
    2024-04-02
  • python dict实现的魔法方法怎么用
    这篇文章主要介绍“python dict实现的魔法方法怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python dict实现的魔法方法怎么用”文章能帮助大家解决问题。方法说明__or__和_...
    99+
    2023-06-30
  • JavaScript的魔法值是什么
    JavaScript的魔法值是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。大家好,我是鱼皮,今天通过一件事情,分享写代码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作