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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值