面向对象编程理解-3

23 运算符重载
23.1 定义

   用自定义的规则实现实例之间的运算符操作或函数操作

23.2 作用:

让实例象数学表达式一样进行运算操作

让实例象内建对象一样进行内建函数操作

让程序简洁易读

23.3 对象转字符串函数重载

          repr(obj)  给机器看的字符串

          两个函数用于返回对象的字符串

repr(obj)返回一个能代表此对象的表达式字符串,通常:evalreprobj)) ==obj

str(obj)    返回一个字符串 给人看的字符串

 

>>>s = ‘I am a progrem’

>>>eval(repr(s)) == s

True

23.3.1 对象转字符串函数重载方法:

   repr()  函数的重载方法:

          def  __repr__(self):

                 ······

   str()  函数的重载方法:

    def __str__(self):

          ·····

注:如果对象没有__str__方法,则用repr(obj)函数的结果代替

示例1

class MyNumber:

    '''此类用于定义一个整型数字类,用于演示str函数重载'''

 

    def __init__(self, value):

        self.value = value

 

n1 = MyNumber(100)

n2 = MyNumber(200)

 

print(repr(n1))

print(str(n2))

执行结果:

<__main__.MyNumber object at 0x7fca98594a58>

<__main__.MyNumber object at 0x7fca98594a90>

示例2

class MyNumber:

    '''此类用于定义一个整型数字类,用于演示str函数重载'''

 

    def __init__(self, value):

        self.value = value

 

    def __repr__(self):

        return 'MyNumber('+repr(self.value)+')'     #访问实例的属性

 

字符串函数被重载,如果str函数没有被重载,其实str(obj)也是调用此函数

 
n1 = MyNumber(100)

n2 = MyNumber(200)

 

print(repr(n1))

print(str(n2))

执行结果

MyNumber(100)

MyNumber(200)

 

示例3

class MyNumber:

    '''此类用于定义一个整型数字类,用于演示str函数重载'''

 

    def __init__(self, value):

        self.value = value

 

    def __repr__(self):

        return 'MyNumber('+repr(self.value)+')'     #访问实例的属性

 

    def __str__(self):

        return '整型数值('+str(self.value)+')'

 

n1 = MyNumber(100)

n2 = MyNumber(200)

 

print(repr(n1))

print(str(n2))

print(n2)

重载了str时,print打印的结果是按照str重载后的打印。

如果str未重载调用repr重载

 
执行结果

MyNumber(100)

整型数值(200)

整型数值(200)

 

示例4

如果将示例3的程序导入到交互模式下,将会有如下结果

>>> n1 = mynumber.MyNumber(100)

>>> n1

MyNumber(100)

两种方式调用函数不同

 
>>> n2 = mynumber.MyNumber(200)

>>> print(n2)

整型数值(200)

24 算术运算符的重载

+, __add__

-, __sub__

*, __mul__

/, __truediv__

//,__floordiv__

%,__mod__

**       __pow__

24.1 二元运算符重载的格式

def __xxx__(slef,other):

   ·······

注:二元运算符的重载方法的参数列表中只能有两个参数

24.2 重载说明:

运算符重载方法的参数已经有固定的含义,不可改变原有意义

除__call__方法外,其它重载方法的参数个数不可变

 

 

 

 

class MyNumber:

    '''此类用于定义一个整型数字类,用于演示str函数重载'''

 

    def __init__(self, value):

        self.value = value

 

    def __repr__(self):

        return 'MyNumber(' + repr(self.value) + ')'  # 访问实例的属性

 

    def __str__(self):

        return '整型数值('+str(self.value)+')'

    def __add__(self,other):

        n = self.value + other.value

        return MyNumber(n)

 

 


n1 = MyNumber(100)

n2 = MyNumber(200)

 

print(n1.__add__(n2))     #等同于下一行

print(n1 + n2)

 

执行结果:

300

300

 

 

示例2

class MyList:

 

    def __init__(self, vaule):

        '''传入参数可变时,必须用拷贝,这样拿到的数据才为此对象所有,否则只是两个变量绑定到一份数据,

        改变原有数据时将改变对象属性的值,这是不允许的'''

        self.vaule = vaule.copy()

 

    def __add__(self, other):

        lst = self.vaule + other.vaule

        return MyList(lst)

 

    def __str__(self):

        return 'MyList(' + str(self.vaule) + ')'

 

 

 

l1 = MyList([1, 2, 3])

 

l2 = MyList([4, 5, 6])

 

print(l1.__add__(l2))  # MyList([1, 2, 3, 4, 5, 6])

print(l2 + l1)

 

print(    MyList([1, 2, 3]) + MyList([4, 5, 6])   )

执行结果

MyList([1, 2, 3, 4, 5, 6])

MyList([4, 5, 6, 1, 2, 3])

MyList([1, 2, 3, 4, 5, 6])

25 反向算术运算

                                                           #这是代码书写格式

+, __radd__(self,lhs)       #      lhs   + self

-, __rsub__(self,lhs)       #      lhs   - self

*, __rmul__(self,lhs)       #      lhs   * self

/, __rtruediv__(self,lhs)    #      lhs   / self

//, __rfloordiv__(self,lhs)  #      lhs  // self

%, __rmod__(self,lhs)     #      lhs   % self

**  __rpow__(self,lhs)      #      lhs **  self


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值