zoukankan      html  css  js  c++  java
  • python类可以截获Python运算符

    类可以截获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
    
  • 相关阅读:
    二级联动
    ajax的post请求方式
    ajax基本常识及get请求方式
    google-gson库下的gson的基本使用
    org.json库下的json的基本使用
    初步认识session
    JSTL的基本使用
    EL的基本使用
    jsp编译器指令errorPage的用法
    poj 1742(好题,楼天城男人八题,混合背包)
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7304843.html
Copyright © 2011-2022 走看看