python面向对象之运算符重载、容器相关方法

运算符重载

运算符重载指的是将运算符与类方法关联起来,每个运算符对应一个指定的内置方法。
Python通过重写一些内置方法,实现了运算符的重载功能。
operator模块提供以下的特殊方法,可以将类的实例使用下面的操作符来操作
在这里插入图片描述
运算符重载示例:

class Person:
    def __init__(self,name,age=18):
        self.name = name
        self.age = age
#
#加减运算符
    def __sub__(self, other):
        return self.age - other.age

    def __add__(self, other):
        return self.age + other.age
# #
#     def __isub__(self, other):
#         print('-=')
#         # return Person(self.name,self.age - other.age)
#         self.age = self.age - other.age  #就地修改
#         return self

# 比较运算符
    def __eq__(self, other):  #比较运算符
        return self.age == other.age

    def __gt__(self, other):
        return self.age > other.age
#
# #
# tom = Person('tom')
# jerry = Person('jerry',age=16)
# # print(tom - jerry)
# # print(tom.__sub__(jerry))   #=====>tom实例调用sub方法,相当于self,jerry相当于other
#
# # jerry -= tom
# # jerry = jerry - tom
# wan = jerry + tom
# # print(jerry)
# print(wan)
#
tom = Person('tom')
jerry = Person('jerry',age=16)
# print(tom > jerry)
# print(tom < jerry)
# print(tom >= jerry)  #执行失败  需要用 >= 方法 __ge__
# print(tom <= jerry)  #执行失败
print(tom == jerry)
print(tom != jerry)

@functools.total_ordering装饰器
作用:比较大小实现的方法,可以使用该装饰器简化代码。
注意:要求__eq__必须实现,其他实现其一`

from functools import total_ordering
@total_ordering
class Person:
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __gt__(self, other):
        return self.age > other.age

tom = Person('tom', 20)
jerry = Person('jerry', 16)

print(tom > jerry)
print(tom < jerry)
print(tom >= jerry)
print(tom <= jerry)

@functools.total_ordering装饰器弊端:可能带来性能问题,一般来说比较实现等于或小于方法就够了,其他可以不实现,此装饰器使用占用资源,不推荐使用。

容器相关方法

len:内建函数len(),返回对象的长度(>=0的整数),如果把对象当作容器类型,如:list或dict
bool()函数调用时,如果没有__bool__()方法,则会看__len__方法是否存在,非0为真。
iter:迭代容器时,调用,返回一个新的迭代器对象
contains:in成员运算符,若没有实现,则调用__iter__方法遍历
getitem:实现self[key]访问。序列对象,用于索引、切片操作,在对象执行索引、切片或者 for 迭代操作时,会自动调用该方法。对于set和dict,key为hashable,key不存在引发keyError异常。
setitem:和 getitem__访问类似,设置值的方法。索引赋值,在通过赋值语句给索引或者切片赋值时,可调用__setitem()方法实现对序列对象的修改。
delitem()方法:当使用 del 关键字删除对象时,实质上会调用__delitem__()方法实现删除操作。
missing:字典或其子类使用 getitem()调用时,key不存在执行该方法。

#__missing__方法实现
# class A(dict):
#     def __missing__(self, key):
#         print('miss key',key)
#         return 0
# a = A()
# print(a['k'])
# __getitem__()方法、__setitem__()方法、__delitem__()方法的实现
class SelectData:
    def __init__(self,data):
        self.data = data[:]
#     def __getitem__(self, index):   #index相当于key
#         return self.data[index]
#
#     def __setitem__(self, index, value):
#         self.data[index] = value
#
#     def __delitem__(self, index):
#         del self.data[index]
#
#     # def __missing__(self, key): #字典或其子类使用 __getitem__()调用时,key不存在执行该方法  不适用于list
#     #     return 0

    def __iter__(self):
        return iter(self.data)  #内建函数封装成一个迭代器返回
#
x = SelectData([12,33,23,"ab",False])
# print(x)    #x的地址
# print(x[:]) #切片,x中的全部元素
# print(x[2]) #切片,x中的下标为2元素
# print(x[2:])    #切片,x中从下标为2起的所有元素
# x[4] = 100  #索引赋值,替换x中的下标为4的元素
# print(x[:])
# del(x[3])   #删除x中的下标为3的元素
# print(x[:])
# print(x[10])  #missing方法之用于字典

for num in x:   #历对象x中的元素遍
    print(num,end="")
print('___________________')
print(33 in x)  #in成员运算符,若没有实现__contains__,则调用__iter__方法遍历
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值