美文网首页
[转载] Python-运算符重载

[转载] Python-运算符重载

作者: 区块链熊猫 | 来源:发表于2020-12-23 12:41 被阅读0次

参考链接: Python中的运算符重载

Python-运算符重载 

本博客用于记录学习Python的运算符重载,欢迎学习交流! 

常见的运算符重载方法: 

__getitem__拦截索引运算

__getitem__和__iter__实现迭代

用户定义的迭代器

__getattr__和__setattr__捕捉属性的引用

模拟实例的私有性

__repr__和__str__会返回字符串表达形式

__radd__处理右侧加法

__call__拦截调用

__dell__是析构器 

sub 

class Number:

    def __init__(self,start):  #构造器方法

        self.data = start

    def __sub__(self,other):

        return Number(self.data - 2*other)

x = Number(5)

print x.data

y = x-1

print y.data 

getitem (拦截索引运算) 

如果在类中定义的话,则对于实例的索引运算,会自动调用getitem。当实例X出现X[i]这样的索引运算时,Python会自动调用getitem方法 

class Indexer(object):

    def __getitem__(self,index):

        return index ** 6

X = Indexer()

print X[2] 

iter实现迭代 

class  SkipInterator:

    def __init__(self,wrapped):

        self.wrapped = wrapped

        self.offset = 0

    def next(self):  #重写next()方法

        if self.offset >= len(self.wrapped):

            raise StopIteration

        else:

            item = self.wrapped[self.offset]

            self.offset +=2

            return item

class SkipObject:

    def __init__(self,wrapped):

        self.wrapped = wrapped

    def __iter__(self):

        return SkipInterator(self.wrapped)

if __name__=='__main__':

    alpha = 'abcdef'

    Skipper=SkipObject(alpha)

    I = iter(Skipper)

    print I.next(),I.next(),I.next()

    for x in Skipper:

        for y in Skipper:

            print x+y, 

getattr和setattr 

# getattr  拦截属性运算

class person:

    def __getattr__(self,attrname):

        if attrname=='age':

            return 40

        else:

            raise AttributeError,attrname

x =person()

print x.age 

setattr  

#setattr 拦截赋值运算      

class accessControl:

    def __setattr__(self,attr,value):

        if attr=='age':

            self.__dict__[attr]=value

        else:

            raise AttributeError,attr+'not allowed'   

c = accessControl()

c.age=34 

print c.age 

call 拦截调用 

class Prod:

    def __init__(self,value):

        self.value = value

    def __call__(self,other):

        return self.value*other

x = Prod(2)

print x(3) 

def 析构器 

实例不用的时候自动执行 

class Life:

    def __init__(self,name = 'unknown'):

        print 'Hello',name

        self.name = name

    def __del__(self):

        print 'Goodbye',self.name

brian =Life()

brian = 'abc' 

输出如下所示: 

 Hello unknown  Goodbye unknown

相关文章

  • [转载] Python-运算符重载

    参考链接: Python中的运算符重载[https://www.imangodoc.com/203.html] P...

  • 运算符重载及其他约定

    7.1 重载算术运算符 重载二元算术运算符 重载复合赋值运算符 重载一元运算符 重载比较运算符 等号运算符:‘eq...

  • C++ 部分运算符重载

    可重载的运算符 不可重载的运算符和符号 重载运算符为类的成员函数 重载运算符为友元函数 重载赋值运算符 重载流插入...

  • 2019-07-11 运算符的重载

    运算符的重载 重载运算符 (“::”,“.*”,“.”,“?:”)不能被重载。 重载运算符时,不能改变其本质,如不...

  • 运算符重载

    一.+号运算符重载 二.<<号运算符重载 三.指针运算符重载(智能指针)

  • C++运算符重载-下篇 (Boolan)

    C++运算符重载-下篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++运算符重载-上篇 (Boolan)

    C++运算符重载-上篇 (Boolan) 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符...

  • C++重载

    重载 C++语言规定: 重载的运算符要保持原运算符的意义。只能对已有的运算符重载,不能增加新的运算符。重载的运算符...

  • C++运算符重载详解

    运算符重载规则 1.被重载的运算符必须是已经存在的C++运算符,不能重载自己创建的运算符; 2.运算符被重载之后,...

  • 第十一章 使用类

    运算符重载 运算符重载是一种形式的C++多态。运算符重载将重载的概念扩展到运算符上,允许赋予C++运算符多种含义。...

网友评论

      本文标题:[转载] Python-运算符重载

      本文链接:https://www.haomeiwen.com/subject/gkvynktx.html