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