python函数能重载吗 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里面没有重载吧?
正常的重载说的应该是函数方法的重载,即两个函数的名称相同但是参数不同是重载,会出现重载的情况一般是函数实现相同功能时,遇到参数类型可能不同的情况,会出现重载 , 如比较常见的对于加法的实现,如果输入两个整数相加则直接使用整数加法,如果两个字符串相加则使用字符串的拼接 。输入的参数类型不同,其实是两个不同的函数,这在那种强类型语言中是可以利用函数重载来实现的,而python中函数类型是动态的各种各样的 , 所以不需要重载这个机制 。相同函数名就是表示同一个方法 。
关于python的重载问题没有重载,但是可以有默认参数和不定长参数,可以判断默认值和参数长度来处理 。
比如:
def range(start, end = -1):
if end == -1:
end = start
start = 0

def range(*args):
if len(args) == 1:
start = 0
end = args[0]
elif len(args) == 2:
start, end = args[0], args[1]
python 有没有方法的重载Python 类可以定义专用方法,专用方法是在特殊情况下或当使用特别语法时由 Python 替你调用的,而不是在代码中直接调用(象普通的方法那样) 。
.1__init__
类似于构造函数

推荐阅读