类可以截获Python运算符

现在,让我们来看类和模块的第三个主要差别:

运算符重载。简而言之,运算符重载就是让用类写成的对象,可截获并响应用在内置类型上的运算:加法、切片、打印和点号运算等。这只是自动分发机制:表达式和其他内置运算流程要经过类的实现来控制。这里也和模块没有什么相似之处:’模块可以实现函数调用,而不是表达式的行为。

虽然我们可以把所有类行为实现为方法函数,运算符重载则让对象和Python的对象模型更紧密地结合起来。此外,因为运算符重载,.让我们自己的对象行为就像内置对象那样,这可促进对象接口更为一致并更易于学习,而且可让类对象由预期的内置类型接口的代码处理。以下是重载运算符主要概念的概要。

以双下划线命名的方法(__x__)是特殊钩子。Python运算符重载的实现是提供特殊命名的方法来拦截运算。Python语言替每种运算和特殊命名的方法之间,定义了固定不变的映射关系。当实例出现在内置运算时,这类方法会自动调用。例如,如果实例对象继承了add方法,当对象出现在+表达式内时,该方法就会调用。该方法的返回值会变成相应表达式的结果。

类可覆盖多数内置类型运算。有几十种特殊运算符重载的方法的名称,几乎可截获并实现内置类型的所有运算。它不仅包括了表达式,而且像打印和对象建立这类基本运算也包括在内。

运算符褪盖方法没有默认值。有几十种特殊运算符重载的方法的名称,几乎可截获它不仅包括了表达式,而且像打印和对象建立这类基而且也不需要。如果类没有定义或继承运算符重载方

法,就是说相应的运算在类实例中并不支持。例如,如果没有__add__,+表达式就会引发异常。
运算符可让类与python的对象模型相集成。重载类型运算时,以类实现的用户定义对象的行为就会像内置对象一样,因此,提供了一致性,以及与预期的接口的兼容性。

运算符重载是可选的功能。主要是替其他Python程序员开发工具的人在使用它,而不是那些应用程序开发人员在使用。此外,不客气地讲,不要因为这看起来很“酷”就随便去试用。除非类需要模仿内置类型接口,不然应该使用更简单的命名的方法。例如,员工数据库应用程序为什么要支持像*和+这类表达式呢?通常来说,像giveRaise和promote这类名称的方法更有意义。
因此,我们不会在本书中深入讨论Python每个可用的运算符重载方法。不过,有个运算
符重载方法,你可能会在每个现实的Python类中遇见:__init__.方法,也也称为构造器方法,它是用于初始化对象的状态的。你应该特别注意这个方法,因为__init__和self参
数是了解Python的OOP程序代码的关键之一。

例子:

这是另一个例子。这一次,我们要定义SecondCI。55的子类,实现三个特殊名称的属性,让Python自动进行调用:当新的实例构造时,会调用_init__(self是新的ThirdClass对象),而当ThirdCI。55实例出现在+或*表达式中时,则分别会调用__add__和mul。以下是新子类。

#!/usr/bin/env python
# -*- coding:utf-8 -*- class FirstClass:
def setdata(self, value):
self.data = value def display(self):
print(self.data) class SecondClass(FirstClass):
def display(self):
print("Current value = %s" %self.data) class ThirdClass(SecondClass):
def __init__(self, value):
self.data = value def __add__(self, other):
return ThirdClass(self.data + other) def __mul__(self, other):
self.data = self.data * other a = ThirdClass("abc")
a.display() b = a + "xyz"
b.display() a * 3
a.display()

运行结果:

Current value = abc
Current value = abcxyz
Current value = abcabcabc

python类可以截获Python运算符的更多相关文章

  1. Python 类总结

    Python可以继承多个父类,多重继承. 类支持多个对象的产生,命名空间的继承,运算符重载1).类产生多个实例对象Python OOP模型中的两种对象:类对象和实例对象.类对象提供默认的行为,是实例对 ...

  2. python类:类方法和静态方法

    http://blog.csdn.net/pipisorry/article/details/49516185 面相对象程序设计中,类方法和静态方法是经常用到的两个术语.逻辑上讲:类方法是只能由类名调 ...

  3. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  4. python类:magic魔术方法

    http://blog.csdn.net/pipisorry/article/details/50708812 魔术方法是面向对象Python语言中的一切.它们是你可以自定义并添加"魔法&q ...

  5. python 类编程相关内容(更新)

    python作为面向对象的编程语言,类和对象相关的编程当然是少不了的! python类: class 类名 : 变量名 [ = 初始值 ] …… def 函数名 ( self [ , 其余参数列表 ] ...

  6. (转)python类:magic魔术方法

    原文:https://blog.csdn.net/pipisorry/article/details/50708812 版权声明:本文为博主皮皮http://blog.csdn.net/pipisor ...

  7. python类和模块区别,python命名空间

    在python中,类可以提供模块级别之下的命名空间. 如果一个模块写很多函数,某些函数之间共同完成一组功能,用类会看起来更清晰,在调用时候也会更好,对于ide补全有更小范围的限定提示. 类提供 继承 ...

  8. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  9. Python类对象

    python类对象 python类对象支持两种操作:属性引用和实例化. 属性引用 使用 Python 中所有属性引用所使用的标准语法: obj.name. 有效的属性名称是类对象被创建时存在于类命名空 ...

随机推荐

  1. ASP.NET Core MVC/WebAPi 模型绑定

    public class Person { public string Name { get; set; } public string Address { get; set; } public in ...

  2. P1281 书的复制

    题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...

  3. hihocoder1776 序列

    思路: 考虑从左至右依次向每个位置放置数字,对于第i个位置,以i为结尾的i个前缀和模P是不能相等的(因为不存在和为P的倍数的子串),所以第i个位置只能放置P - i个不同的数字.则答案就是(P - 1 ...

  4. 【原创】微信公众号与HTML 5混合模式揭秘4——jssdk调用微信扫一扫

    微信公众号与HTML 5混合模式揭秘1——如何部署JSSDK 微信公众号与HTML 5混合模式揭秘2——分享手机相册中照片 微信公众号与HTML 5混合模式揭秘3——JSSDK获取地理位置   在JS ...

  5. error: stray '\343' in program 问题解决

          当我们从网上copy一段代码后,总会出现这个问题.博主在Arduino环境中也出现了,so,这个问题应该是C语言和C++编译器中才会出现的. test_int:19: error: str ...

  6. jsp中<c:forEach varStatus="status">的属性值问题

    c:forEach varStatus属性 current当前这次迭代的(集合中的)项 index当前这次迭代从 0 开始的迭代索引 count当前这次迭代从 1 开始的迭代计数 first用来表明当 ...

  7. web前端性能优化 (share)

    本文转自:http://www.cnblogs.com/50614090/archive/2011/08/19/2145620.html 一. WEB前台的优化规则 一.尽量减少 HTTP 请求 有几 ...

  8. Grace Huang 2017/1/12

    原文 Huang doesn't think of acting as pretending to be someone else.Rather,she considers it an opportu ...

  9. iphone开发设置默认字体

    It seems to be possible in iOS 5 using the UIAppearance proxy. [[UILabel appearance] setFont:[UIFont ...

  10. JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...