广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python运算符重载详解及实例代码
  • 352
分享到

Python运算符重载详解及实例代码

详解运算符实例 2022-06-04 18:06:46 352人浏览 薄情痞子

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

摘要

Python运算符重载 python语言提供了运算符重载功能,增强了语言的灵活性,这一点与c++有点类似又有些不同。鉴于它的特殊性,今天就来讨论一下Python运算符重载。 Pyth

Python运算符重载

python语言提供了运算符重载功能,增强了语言的灵活性,这一点与c++有点类似又有些不同。鉴于它的特殊性,今天就来讨论一下Python运算符重载。

Python语言本身提供了很多魔法方法,它的运算符重载就是通过重写这些Python内置魔法方法实现的。这些魔法方法都是以双下划线开头和结尾的,类似于__X__的形式,python通过这种特殊的命名方式来拦截操作符,以实现重载。当Python的内置操作运用于类对象时,Python会去搜索并调用对象中指定的方法完成操作。

类可以重载加减运算、打印、函数调用、索引等内置运算,运算符重载使我们的对象的行为与内置对象的一样。Python在调用操作符时会自动调用这样的方法,例如,如果类实现了__add__方法,当类的对象出现在+运算符中时会调用这个方法。

常见运算符重载方法

方法名

重载说明

运算符调用方式

__init__

构造函数

对象创建: X = Class(args)

__del__

析构函数

X对象收回

__add__/__sub__

加减运算

X+Y, X+=Y/X-Y, X-=Y

__or__

运算符|

X|Y, X|=Y

_repr__/__str__

打印/转换

print(X)、repr(X)/str(X)

__call__

函数调用

X(*args, **kwargs)

__getattr__

属性引用

X.undefined

__setattr__

属性赋值

X.any=value

__delattr__

属性删除

del X.any

__getattribute__

属性获取

X.any

__getitem__

索引运算

X[key],X[i:j]

__setitem__

索引赋值

X[key],X[i:j]=sequence

__delitem__

索引和分片删除

del X[key],del X[i:j]

__len__

长度

len(X)

__bool__

布尔测试

bool(X)

__lt__, __gt__,

__le__, __ge__,

__eq__, __ne__

特定的比较

依次为X<Y,X>Y,X<=Y,X>=Y,

X==Y,X!=Y

注释:(lt: less than, gt: greater than,

le: less equal, ge: greater equal,

eq: equal, ne: not equal

__radd__

右侧加法

other+X

__iadd__

实地(增强的)加法

X+=Y(or else __add__)

__iter__, __next__

迭代

I=iter(X), next()

__contains__

成员关系测试

item in X(X为任何可迭代对象)

__index__

整数值

hex(X), bin(X), oct(X)

__enter__, __exit__

环境管理器

with obj as var:

__get__, __set__,

__delete__

描述符属性

X.attr, X.attr=value, del X.attr

__new__

创建

在__init__之前创建对象

下面对常用的运算符方法的使用进行一下介绍。

构造函数和析构函数:__init__和__del__

它们的主要作用是进行对象的创建和回收,当实例创建时,就会调用__init__构造方法。当实例对象被收回时,析构函数__del__会自动执行。


>>> class Human(): 
...   def __init__(self, n): 
...     self.name = n 
...       print("__init__ ",self.name) 
...   def __del__(self): 
...     print("__del__") 
...  
>>> h = Human('Tim') 
__init__ Tim 
>>> h = 'a' 
__del__ 

加减运算:__add__和__sub__

重载这两个方法就可以在普通的对象上添加+-运算符操作。下面的代码演示了如何使用+-运算符,如果将代码中的__sub__方法去掉,再调用减号运算符就会出错。


>>> class Computation(): 
...   def __init__(self,value): 
...     self.value = value 
...   def __add__(self,other): 
...     return self.value + other 
...   def __sub__(self,other): 
...     return self.value - other 
...  
>>> c = Computation(5) 
>>> c + 5 
10 
>>> c - 3 
2 

对象的字符串表达形式:__repr__和__str__

这两个方法都是用来表示对象的字符串表达形式:print()、str()方法会调用到__str__方法,print()、str()和repr()方法会调用__repr__方法。从下面的例子可以看出,当两个方法同时定义时,Python会优先搜索并调用__str__方法。


>>> class Str(object): 
...   def __str__(self): 
...     return "__str__ called"   
...   def __repr__(self): 
...     return "__repr__ called" 
...  
>>> s = Str() 
>>> print(s) 
__str__ called 
>>> repr(s) 
'__repr__ called' 
>>> str(s) 
'__str__ called' 

索引取值和赋值:__getitem__, __setitem__

通过实现这两个方法,可以通过诸如 X[i] 的形式对对象进行取值和赋值,还可以对对象使用切片操作。


>>> class Indexer: 
  data = [1,2,3,4,5,6] 
  def __getitem__(self,index): 
    return self.data[index] 
  def __setitem__(self,k,v): 
    self.data[k] = v 
    print(self.data) 
>>> i = Indexer() 
>>> i[0] 
1 
>>> i[1:4] 
[2, 3, 4] 
>>> i[0]=10 
[10, 2, 3, 4, 5, 6] 

设置和访问属性:__getattr__、__setattr__

我们可以通过重载__getattr__和__setattr__来拦截对对象成员的访问。__getattr__在访问对象中不存在的成员时会自动调用。__setattr__方法用于在初始化对象成员的时候调用,即在设置__dict__的item时就会调用__setattr__方法。具体例子如下:


class A(): 
  def __init__(self,ax,bx): 
    self.a = ax 
    self.b = bx 
  def f(self): 
    print (self.__dict__) 
  def __getattr__(self,name): 
    print ("__getattr__") 
  def __setattr__(self,name,value): 
    print ("__setattr__") 
    self.__dict__[name] = value 
 
a = A(1,2) 
a.f() 
a.x 
a.x = 3 
a.f() 

上面代码的运行结果如下,从结果可以看出,访问不存在的变量x时会调用__getattr__方法;当__init__被调用的时候,赋值运算也会调用__setattr__方法。


__setattr__ 
__setattr__ 
{'a': 1, 'b': 2} 
__getattr__ 
__setattr__ 
{'a': 1, 'x': 3, 'b': 2} 

迭代器对象: __iter__, __next__

Python中的迭代,可以直接通过重载__getitem__方法来实现,看下面的例子。


>>> class Indexer: 
...   data = [1,2,3,4,5,6] 
...   def __getitem__(self,index): 
...       return self.data[index] 
...  
>>> x = Indexer() 
>>> for item in x: 
...   print(item) 
...  
1 
2 
3 
4 
5 
6 

通过上面的方法是可以实现迭代,但并不是最好的方式。Python的迭代操作会优先尝试调用__iter__方法,再尝试__getitem__。迭代环境是通过iter去尝试寻找__iter__方法来实现,而这种方法返回一个迭代器对象。如果这个方法已经提供,Python会重复调用迭代器对象的next()方法,直到发生StopIteration异常。如果没有找到__iter__,Python才会尝试使用__getitem__机制。下面看一下迭代器的例子。


class Next(object): 
  def __init__(self, data=1): 
    self.data = data 
  def __iter__(self): 
    return self 
  def __next__(self): 
    print("__next__ called") 
    if self.data > 5: 
      raise StopIteration 
    else: 
      self.data += 1 
      return self.data 
for i in Next(3): 
  print(i) 
print("-----------") 
n = Next(3) 
i = iter(n) 
while True: 
  try: 
    print(next(i)) 
  except Exception as e: 
    break 

程序的运行结果如下:


__next__ called 
4 
__next__ called 
5 
__next__ called 
6 
__next__ called 
----------- 
__next__ called 
4 
__next__ called 
5 
__next__ called 
6 
__next__ called 

可见实现了__iter__和__next__方法后,可以通过for in的方式迭代遍历对象,也可以通过iter()和next()方法迭代遍历对象。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

--结束END--

本文标题: Python运算符重载详解及实例代码

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python运算符重载详解及实例代码
    Python运算符重载 Python语言提供了运算符重载功能,增强了语言的灵活性,这一点与C++有点类似又有些不同。鉴于它的特殊性,今天就来讨论一下Python运算符重载。 Pyth...
    99+
    2022-06-04
    详解 运算符 实例
  • Python运算符重载的简单实例代码
    目录什么是运算符重载以__pow__为例反向运算符的重载总结什么是运算符重载 让自定义的类生成的对象(实例)能够使用运算符进行操作 作用: 让自定义的实例像内建对象一样进行运算符操作...
    99+
    2022-11-12
  • Python运算符重载的实例代码怎么编写
    Python运算符重载的实例代码怎么编写,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是运算符重载让自定义的类生成的对象(实例)能够使用运算符进行操作作用:让自定义的实例像...
    99+
    2023-06-26
  • Python的运算符重载详解
    目录一、前言二、重载作用三、自定义列表一、前言 运算符重载:为运算符定义方法 所谓重载,就是赋予新的含义同一个运算符可以有不同的功能 二、重载作用 让自定义的实例像内建对象一样进行运...
    99+
    2022-11-12
  • Python 3 之 运算符重载详解
    基础知识实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。以下是对重载的关键概念的复习:运算符重载让类拦截常规的Python运算。...
    99+
    2023-01-31
    详解 运算符 Python
  • Python运算符重载实例分析
    这篇文章主要讲解了“Python运算符重载实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python运算符重载实例分析”吧!一、运算符重载(一)概述运算符重载是通过实现特定的方法使类...
    99+
    2023-06-29
  • Python三目运算符(三元运算符)用法详解(含实例代码)
    目录一、前言二、Python中的三目运算符三、在三目运算符中放置多条语句方式四、总结五、三目运算符的嵌套总结一、前言 三目运算符,又称条件运算符,是计算机语言(c,c++,java等...
    99+
    2023-02-03
    Python三目运算符 python中三元运算符 python三目运算
  • C++11运算符重载和向量类重载实例详解(<<,>>,+,-,*等)
    目录1. C++运算符重载介绍1.1 单目运算符与双目运算符1.2 友元运算符2. 实例讲解2.1 头文件定义2.2 实现运算符重载总结1. C++运算符重载介绍 C ++ 中预定义...
    99+
    2022-11-12
  • python接口,继承,重载运算符详解
    目录1. 序列__getitem__2. __setitem__3. 抽象基类4. 不要直接子类化内置类型5. 继承顺序6. 重载运算符总结1. 序列__getitem__ 如果没...
    99+
    2022-11-12
  • C++中的运算符重载详解
    目录1、引例2、类中自动建立的函数3、重载赋值运算符解析总结1、引例 class Complex { private: double Real,Image; public: ...
    99+
    2022-11-13
  • C++运算符重载图文详解
    目录1. 运算符重载1.1 运算符重载为普通函数1.2 运算符重载为成员函数2. 赋值运算符=的重载2.1浅复制与深复制2.2返回值的讨论3. 动态可变长度数组总结1. 运算符重载 ...
    99+
    2022-11-12
  • Python入门教程之运算符重载详解
    目录如何重载Python中的运算符在 Python中重载比较运算符重载相等和小于运算符用于运算符重载的 Python 魔术方法或特殊函数二元运算符比较运算符赋值运算符一元运算符运算符...
    99+
    2022-11-11
  • Python编程基础之运算符重载详解
    目录学习目标一、运算符重载(一)概述(二)加法运算重载符1、概述2、案例演示总结学习目标 1.掌握运算符重载 2.会定制对象字符串的形式 一、运算符重载 (一)概述 运算符重载是通过...
    99+
    2022-11-13
  • Swift 重构重载运算符示例解析
    目录一、思路来源二、基础类型 String 为例重载乘法运算符源码实现:三、对象类型 UIEdgeInsets 为例重载加法运算符将源码实现:四、总结一、思路来源 研究自定义运算符...
    99+
    2023-03-13
    Swift 重构重载运算符 Swift  重构重载
  • Python三目运算符(三元运算符)用法详解(含Python代码)
    一、前言 三目运算符,又称条件运算符,是计算机语言(c,c++,java等)的重要组成部分。它是唯一有3个操作数的运算符,有时又称为三元运算符。 定义: 对于条件表达式b x : y,先计算条件b,...
    99+
    2023-09-26
    python 开发语言 三目运算符
  • C++重载的奥义之运算符重载详解
    目录0、引言1、运算符重载定义2、作为成员函数进行重载3、作为全局函数进行重载4、运算符重载的一些规则0、引言 重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一...
    99+
    2023-05-16
    C++ 运算符重载 C++ 运算符 C++ 重载
  • C++中运算符重载详解及其作用介绍
    目录概述函数重载运算符重载C++ 的运算符重载运算符的规则成员函数实现 Complex 加法运算符重载的方法多种实现方法实现 operator+=三种运算符重载函数成员函数实现友元函...
    99+
    2022-11-12
  • C++中运算符重载问题详解
    C++中运算符重载问题详解运算符重载是C++中的一个重要特性,它允许我们为自定义的类类型重载运算符,使得这些类对象之间的运算能够像内置类型一样进行。在本文中,我们将详细讨论C++中运算符重载的概念、使用方法以及常见的问题。一、什么是运算符重...
    99+
    2023-10-22
    问题详解 C++运算符重载
  • C++超详细讲解运算符重载
    目录概念赋值运算符重载const成员取地址及const取地址操作符重载概念 C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名...
    99+
    2022-11-13
  • C语言运算符的重载详解
    目录运算符重载的规则 1. 运算符重载为成员函数2. 运算符重载为非成员函数        ...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作