符合中小企业对网站设计、功能常规化式的企业展示型网站建设
本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...
商城网站建设因基本功能的需求不同费用上面也有很大的差别...
手机微信网站开发、微信官网、微信商城网站...
python里面没有重载吧?
创新互联主要从事网站设计制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务桂阳,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
正常的重载说的应该是函数方法的重载,即两个函数的名称相同但是参数不同是重载,会出现重载的情况一般是函数实现相同功能时,遇到参数类型可能不同的情况,会出现重载,如比较常见的对于加法的实现,如果输入两个整数相加则直接使用整数加法,如果两个字符串相加则使用字符串的拼接。输入的参数类型不同,其实是两个不同的函数,这在那种强类型语言中是可以利用函数重载来实现的,而python中函数类型是动态的各种各样的,所以不需要重载这个机制。相同函数名就是表示同一个方法。
Python正确重载运算符的方法示例详解
说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~)。说得宽泛一些,在 Python 中,函数调用(())、属性访问(.)和元素访问 / 切片([])也是运算符。
我们为 Vector 类简略实现了几个运算符。__add__ 和 __mul__ 方法是为了展示如何使用特殊方法重载运算符,不过有些小问题被我们忽视了。此外,我们定义的Vector2d.__eq__ 方法认为 Vector(3, 4) == [3, 4] 是真的(True),这可能并不合理。下面来一起看看详细的介绍吧。
运算符重载基础
在某些圈子中,运算符重载的名声并不好。这个语言特性可能(已经)被滥用,让程序员困惑,导致缺陷和意料之外的性能瓶颈。但是,如果使用得当,API 会变得好用,代码会变得易于阅读。Python 施加了一些限制,做好了灵活性、可用性和安全性方面的平衡:
不能重载内置类型的运算符
不能新建运算符,只能重载现有的
某些运算符不能重载——is、and、or 和 not(不过位运算符
、| 和 ~ 可以)
前面的博文已经为 Vector 定义了一个中缀运算符,即 ==,这个运算符由__eq__ 方法支持。我们将改进 __eq__ 方法的实现,更好地处理不是Vector 实例的操作数。然而,在运算符重载方面,众多比较运算符(==、!=、、、=、=)是特例,因此我们首先将在 Vector 中重载四个算术运算符:一元运算符 - 和 +,以及中缀运算符 + 和 *。
一元运算符
-(__neg__)
一元取负算术运算符。如果 x 是 -2,那么 -x == 2。
+(__pos__)
一元取正算术运算符。通常,x == +x,但也有一些例外。如果好奇,请阅读“x 和 +x 何时不相等”附注栏。
~(__invert__)
对整数按位取反,定义为 ~x == -(x+1)。如果 x 是 2,那么 ~x== -3。
支持一元运算符很简单,只需实现相应的特殊方法。这些特殊方法只有一个参数,self。然后,使用符合所在类的逻辑实现。不过,要遵守运算符的一个基本规则:始终返回一个新对象。也就是说,不能修改self,要创建并返回合适类型的新实例。
对 - 和 + 来说,结果可能是与 self 同属一类的实例。多数时候,+ 最好返回 self 的副本。abs(...) 的结果应该是一个标量。但是对 ~ 来说,很难说什么结果是合理的,因为可能不是处理整数的位,例如在ORM 中,SQL WHERE 子句应该返回反集。
def __abs__(self):
return math.sqrt(sum(x * x for x in self))
def __neg__(self):
return Vector(-x for x in self) #为了计算 -v,构建一个新 Vector 实例,把 self 的每个分量都取反
def __pos__(self):
return Vector(self) #为了计算 +v,构建一个新 Vector 实例,传入 self 的各个分量
x 和 +x 何时不相等
每个人都觉得 x == +x,而且在 Python 中,几乎所有情况下都是这样。但是,我在标准库中找到两例 x != +x 的情况。
第一例与 decimal.Decimal 类有关。如果 x 是 Decimal 实例,在算术运算的上下文中创建,然后在不同的上下文中计算 +x,那么 x!= +x。例如,x 所在的上下文使用某个精度,而计算 +x 时,精度变了,例如下面的
Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样)。
.1 __init__
类似于构造函数
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def say(self):
print self.name
study = Study("Badboy")
study.say()
.2 __del__
类似于析构函数
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def __del__(self):
print "Iamaway,baby!"
def say(self):
print self.name
study = Study("zhuzhengjun")
study.say()
.3__repr__
使用repr(obj)的时候,会自动调用__repr__函数,该函数返回对象字符串表达式,
用于重建对象,如果eval(repr(obj))会得到一个对象的拷贝。
#!/usr/local/bin/python
class Study:
def __init__(self,name=None):
self.name = name
def __del__(self):
print "Iamaway,baby!"
def say(self):
print self.name
def __repr__(self):
return "Study('jacky')"
study = Study("zhuzhengjun")
study.say()
print type(repr(Study("zhuzhengjun"))) # str
print type(eval(repr(Study("zhuzhengjun")))) # instance
study = eval(repr(Study("zhuzhengjun")))
study.say()
.4__str__
Python能用print语句输出内建数据类型。有时,程序员希望定义一个类,要求它的对象也能用print语句输出。Python类可定义特殊方法__str__,为类的对象提供一个不正式的字符串表示。如果类的客户程序包含以下语句:
print objectOfClass
那么Python会调用对象的__str__方法,并输出那个方法所返回的字符串。
#!/usr/local/bin/python
class PhoneNumber:
def __init__(self,number):
self.areaCode=number[1:4]
self.exchange=number[6:9]
self.line=number[10:14]
def __str__(self):
return "(%s) %s-%s"%(self.areaCode,self.exchange,self.line)
def test():
newNumber=raw_input("Enter phone number in the form. (123) 456-7890: \n")
phone=PhoneNumber(newNumber)
print "The phone number is:"
print phone
if__name__=="__main__":
test()
方法__init__接收一个形如"(xxx) xxx-xxxx"的字符串。字符串中的每个x都是电话号码的一个位数。方法对字符串进行分解,并将电话号码的不同部分作为属性存储。
方法__str__是一个特殊方法,它构造并返回PhoneNumber类的一个对象的字符串表示。解析器一旦遇到如下语句:
print phone
就会执行以下语句:
print phone.__str__()
程序如果将PhoneNumber对象传给内建函数str(如str(phone)),或者为PhoneNumber对象使用字符串格式化运算符%(例如"%s"%phone),Python也会调用__str__方法。
.5__cmp __
比较运算符,0:等于 1:大于 -1:小于
class Study:
def __cmp__(self, other):
if other 0 :
return 1
elif other 0:
return - 1
else:
return 0
study = Study()
if study -10:print 'ok1'
if study -10:print 'ok2'
if study == 0:print 'ok3'
打印:ok2 ok3
说明:在对类进行比较时,python自动调用__cmp__方法,如-10 0 返回 -1,也就是说study 应该小与 -10,估打印ok2
.6__getitem__
__getitem__ 专用方法很简单。象普通的方法 clear,keys 和 values 一样,它只是重定向到字典,返回字典的值。
class Zoo:
def __getitem__(self, key):
if key == 'dog':return 'dog'
elif key == 'pig':return 'pig'
elif key == 'wolf':return 'wolf'
else:return 'unknown'
zoo = Zoo()
print zoo['dog']
print zoo['pig']
print zoo['wolf']
打印 dog pig wolf
.7__setitem__
__setitem__ 简单地重定向到真正的字典 self.data ,让它来进行工作。
class Zoo:
def __setitem__(self, key, value):
print 'key=%s,value=%s' % (key, value)
zoo = Zoo()
zoo['a'] = 'a'
zoo['b'] = 'b'
zoo['c'] = 'c'
打印:
key=a,value=a
key=b,value=b
key=c,value=c
.8 __delitem__
__delitem__ 在调用 del instance[key] 时调用 ,你可能记得它作为从字典中删除单个元素的方法。当你在类实例中使用 del 时,Python 替你调用 __delitem__ 专用方法。
class A:
def __delitem__(self, key):
print 'delete item:%s' %key
a = A()
del a['key']
【区别】:
标准库函数都需要import xxx才能取得。
内建函数都在__builtins__里面,在global里直接就能用。
【补充】:
1.python中,我们可以通过对内建的比较函数进行自定义,来实现运算符重载。
我们常用的比较运算符有
大于 对应的内建比较函数为 __gt__()
大于等于 = 对应的内建比较函数为 __ge__()
等于 == 对应的内建比较函数为 __eq__()
小于 对应的内建比较函数为 __lt__()
小于等于 = 对应的内建比较函数为 __le__()
2.库函数(Library function)是把函数放到库里,供别人使用的一种方式。.方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include加到里面就可以了。一般是放到lib文件里的。
参考资料
百度.百度[引用时间2018-4-12]