面向对象编程理解-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


猜你喜欢

转载自blog.csdn.net/areigninhell/article/details/79918330