网站首页 > 文章中心 > 其它

python函数重载吗

作者:小编 更新时间:2023-10-21 07:19:50 浏览量:78人看过

python运算符重载问题

搜 API Changes

python怎么重载in关键字

f=open('aaa.txt')

l=f.readline()

python函数重载吗-图1

for

i

in

l:

if

"bbb"

i:

print

"ok

f.close()

python函数重载吗-图2

打开文件aaa.txt

for循环,一行一行的,如果bbb关键字在i这一行,打印ok

Python一种实现类似于重载的方法,*k是什么意思?

*k表示可变参数,通过可变参数实现类似于重载的方法.

通常我们要定义一个函数的时候,必须要预先定义这个函数需要多少个参数(或者说可以接受多少个参数).一般情况下这是没问题的,但是也有在定义函数的时候,不能知道参数个数的情况(想一想C语言里的printf函数),在Python里,带*的参数就是用来接受可变数量参数的.看一个例子

def funcD(a, b, *c):

print a

print b

print "length of c is: %d " % len(c)

print c

Python正确重载运算符的方法示例详解

Python正确重载运算符的方法示例详解

说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~).说得宽泛一些,在 Python 中,函数调用(())、属性访问(.)和元素访问 / 切片([])也是运算符.

运算符重载基础

在某些圈子中,运算符重载的名声并不好.这个语言特性可能(已经)被滥用,让程序员困惑,导致缺陷和意料之外的性能瓶颈.但是,如果使用得当,API 会变得好用,代码会变得易于阅读.Python 施加了一些限制,做好了灵活性、可用性和安全性方面的平衡:

不能重载内置类型的运算符

不能新建运算符,只能重载现有的

某些运算符不能重载——is、and、or 和 not(不过位运算符

、| 和 ~ 可以)

前面的博文已经为 Vector 定义了一个中缀运算符,即 ==,这个运算符由__eq__ 方法支持.我们将改进 __eq__ 方法的实现,更好地处理不是Vector 实例的操作数.然而,在运算符重载方面,众多比较运算符(==、!=、、、=、=)是特例,所以呢我们首先将在 Vector 中重载四个算术运算符:一元运算符 - 和 +,以及中缀运算符 + 和 *.

一元运算符

-(__neg__)

+(__pos__)

一元取正算术运算符.通常,x == +x,但也有一些例外.如果好奇,请阅读"x 和 +x 何时不相等"附注栏.

~(__invert__)

支持一元运算符很简单,只需实现相应的特殊方法.这些特殊方法只有一个参数,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 重载和重写的区别

重载和重写,这是两个新概念,是两个令我们容易混淆的概念.方法重载(overloading method)

是在一个类里面,方法名字相同,而参数不同.返回类型呢?可以相同也可以不同.方法重写(overiding method)

子类不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写.方法重写又称方法覆盖.方法重载是让类以统一的方式处理不同类型数据的

一种手段.Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义.调用方法时通过传递给它们的不同个数和

类型的参数来决定具体使用哪个方法,

这就是多态性.方法重写:在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法.但有时子类并不想原封不动地继承父类的方法,而是想作一定

的修改,这就需要采用方法的重写.方法重写又称方法覆盖.

若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法.

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类重写方法的规则:

参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.

返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载.访问修饰符的限制一定要大于被重写方法的访问修饰符

(publicprotecteddefaultprivate)重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽

泛的检查型异常.例如,父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出

python函数重载吗-图3

IOException的子类异常,可以抛出非检查异常.重载的规则:必须具有不同的参数列表;可以有不同的返回类型,只要参数列表不同就可以

了;可以有不同的访问修饰符;可以抛出不同的异常;注意,Java的方法重载要求同名的方法必须有不同的参数表,仅有返回类型不同是不足以区分两

个重载的方法.重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法.下面分别举一个例子来说明方法重载:public class

TestOverLoad{ public static void main(String[] args) {Test test = new

Test(); test.print(null); } }class Test{ public void print(String

some){System.out.println("String version print"); } public void

print(Object some){ System.out.println("Object version print");

}}该程序输出的结果是String version print.

Python魔法函数(特殊函数)

Python中如何实现运算符的重载,即实现例如a+b这样的运算符操作呢?

在C++中可以使用 operator 关键字实现运算符的重载.但是在Python中没有类似这样的关键字,所以要实现运算符的重载,就要用到Python的魔法函数.Python魔法函数是以双下划线开头,双下划线结尾的一组函数.我们在类定义中最常用到的 __init__ 函数就是这样一个魔法函数,它在创建类对象时被自动调用.

下面我们来看个简单的例子.

代码中还有一个特殊的 __call__ 函数,该函数在将对象采用函数调用方式使用时被调用, 例如v1()相当于v1. call ().

以上就是土嘎嘎小编为大家整理的python函数重载吗相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章