python中的运算符重载_Python中的操作符重载

Python部落组织翻译,禁止转载,欢迎转发。

BY ALOK THAKUR · FEBRUARY 22, 2016

2016年2月22日 , ALOK THAKUR写

Python支持许多内建的类型,例如列表,集合,字典等等。它还允许编程用户来定义自己的类型通常被称为用户定义的类型。Python还有一些内置操作来操作所有对象的类型。似乎有点不合理,如果用户没有控制操作用户定义的类型。

操作符重载来帮忙了。

1. 操作符重载允许用户定义类型拦截Python内置操作 。

2. 所有Python表达式运算符如“+”、“-”都可以重载

3. 内置的操作例如打印,属性访问等都可以重载。

4. Python在类中提供了专门命名方法来支持操作符重载

它允许用户决定一个语言按照用户定义的类型如何进行内置操作。

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

让我们从最常见的示例中来讲,我们将定义我们自己的str类型,这种类型将比Python 中的str类型要强大许多。class String(object):

def __init__(self, val):

print "Creating instance of String"

self.val = val

def __del__(self):

print "Deleting instance of String"

#Python does support automatic garbage collection,

#Having destructor in your class may not be needed in most of the cases.

>>> st = String("Hello Python")

Creating instance of String

>>> del st

Deleting instance of String

从技术上来讲 __init__ 是一个构造函数 , 它应该被使用来初始化实例属性。然后谁真正意义上的来构造实例呢 ?

让我们现在来重载__new__。

class String(object):

def __new__(cls, *args, **kargs):

print "Creating instance of String"

return super(String, cls).__new__(cls)

def __init__(self, val):

print "Initiating instance of String"

self.val = val

def __del__(self):

print "Deleting instance of String"

>>> st = String("Hello Python")

Creating instance of String

Initiating instance of String

__add__ 和 __sub__用来重载‘+’ , ‘-’运算符。

class String(object):

def __init__(self, val):

self.val = val

def __add__(self, other):

return self.val + '-' + other.val

def __sub__(self, other):

return "not supported"

>>> st1 = String("hello")

>>> st2 = String("Python")

>>> st1+st2

'hello-Python'

>>> st1 - st2

'not supported'

索引 : __getitem__ 和 __setitem__。

到目前为止 , 我们已经创建了用户自定义类型string(字符串)和重载操作符 ‘+’和‘-’Python string(字符串) 支持索引,让我们来检查一下我们的‘string’类型是否支持索引呢 ?

>>> print st1[0]

TypeError: 'String' object does not support indexing

__getitem__的帮助文档在这里, 我们将会修改string的功能通过重载__setitem__。

class String(object):

def __init__(self, val):

self.val = val

def __getitem__(self, index):

return self.val[index]

def __setitem__(self, index, val):

"hack to modify string"

self.val = list(self.val)

self.val[index] = val

self.val = ''.join(self.val)

现在 ,‘string’类型索引应该起作用了。

>>> print st[0]

H

>>> print st[1]

e

正如我之前承诺的一样,我们的‘String’类型将会比Python的‘str’类型做更多的事情。

st[6] = 'C' #This is something won't work on python str

>>> print st.val

Hello Cython

让我们试着打印‘String’类型的实例。

>>> print st  #It should print string value like python str

让我们现在重载print(打印)操作符。

__str__ and __repr__

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __repr__(self):

return "This is String representation of " + self.val

现在打印 ‘String’类型应该会像Python‘str’类型一样工作。

>>> print st     #it calls __str__

Hello Python

>>> st           #It calls __repr__

This is String representation of Hello Python

拥有基本的string功能的完整的String类。

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __repr__(self):

return "This is String representation of " + self.val

def __getitem__(self, index):

return self.val[index]

def __setitem__(self, index, val):

"hack to modify string"

self.val = list(self.val)

self.val[index] = val

self.val = ''.join(self.val)

def __add__(self, other):

return self.val + '-' + other.val

def __sub__(self, other):

return "not supported"

我们仍然希望能看到一些其他的操作符可以被重载并且被使用在设计模式中,我将在随后的主题中介绍那些知识。

英文原文:http://www.pythonabc.com/operator-overloading-python/

译者:wanghuan2054

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python运算符重载是指通过实现特殊方法,使得自定义对象可以像内置对象一样进行运算操作。在Python运算符重载使用特殊方法来定义对象的行为。通过在类实现这些特殊方法,我们可以为对象定义不同的运算符操作。 在我们的引用,我们讨论了Python运算符重载的限制条件、数据模型和特殊方法。通过实现这些特殊方法,我们可以为自定义对象定义运算符操作。 在引用,我们提到Python语言对操作符重载有一些限制性规则。需要注意这些规则并在实现运算符重载时遵守。 举个例子,在引用,我们尝试对两个Vector对象进行相加操作。然而,由于我们没有实现Vector类的相加运算符特殊方法,因此出现了TypeError。在这种情况下,我们需要在Vector类实现 __add__ 方法来定义两个Vector对象的相加操作。 所以,总的来说,Python运算符重载是通过实现特殊方法来定义自定义对象的运算符行为,使其可以像内置对象一样进行运算操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python 运算符重载](https://blog.csdn.net/pythonputao/article/details/111314428)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值