2019/12/02 01-slots、反向方法、生成器交互

python相当于一个大框架,把所有的模式方法都开发好了,你可以用这些协议去添入自己的代码就可以用了,要看这些容器方法把对象封装成什么样子,容器化,上下文在这里插入图片描述
字典查询快,是因为有hash,把key计算一遍放到内存地址上作为门牌号,然后要给这里面放数据,下面找的时候会把数据再做一次hash,得到门牌号,就直接找到门牌号了
时间复杂度是O(1)
字典缺点就是内存占用率大,最简单的hash算法就是取模,有时候要封装数百万个数据,实例的属性拿什么记录,字典,每个实例都有dict

下面是取模5来分配
在这里插入图片描述
字典是空间换时间,知道值在哪个空间里
空间换时间,和时间换空间,这两者不可兼得
如果有数百万个对象,字典的缺点就比较明显了
在这里插入图片描述
python提供了__slots__这个不太消耗内存的
类一般只有一份,类的实例可以有很多,每个实例有不同的字典
在这里插入图片描述在这里插入图片描述在这里插入图片描述
给一个__slots__,A的属性是没有属性y的在这里插入图片描述
A的对象没有__dict__,只要定义了slots就没有了,一旦定义了__slots__,__dict__这个浪费空间的东西就消失了 在这里插入图片描述在这里插入图片描述
定义了slots,这样写也没事在这里插入图片描述
还没有打印,就说A实例没有a这个属性在这里插入图片描述
动态增加依然出现问题
在这里插入图片描述
在slots加个a即可在这里插入图片描述
把z去掉就直接报错了在这里插入图片描述
对A来讲,X是只读的在这里插入图片描述
这样就没关系
在这里插入图片描述
这个地方就定义了一个实例所能拥有的属性是什么,可以动他添加,但是要求里面有在这里插入图片描述
以前字典是可变类型,可以随便放,动态添加,现在用slots固定下来,不允许动态添加了
在这里插入图片描述
现在还不能影响子类,但是A的实例是影响的
在这里插入图片描述
是因为B是由字典的
在这里插入图片描述
这个slots不会继承,只会影响当前类的定义,是影响实例的属性的,把实例的字典拿掉了,每个实例没有字典了,为了不让实例的字典过多消耗内存就去掉了
在这里插入图片描述在这里插入图片描述
试试元组是否可以,tuple把列表转元组,这里只要是个可迭代对象就ok了,一般写成列表,里面的字符串就是属性名在这里插入图片描述
可以判断是否是str,是str就把这些包起来,list转换成列表在这里插入图片描述在这里插入图片描述
一旦类提供slots,就阻止实例产生dict来保存实例的属性在这里插入图片描述
slots不影响子类实例,不会继承下去,除非子类里面自己也定义了slots
在这里插入图片描述
建立百万多,也不过耗费百兆内存,换成slots,内存使用率在30,40兆左右,实际用的很少,如果是内存受限系统,单片机和树莓派就需要考虑了
时间复杂度是运行的效率,空间复杂度是耗费的空间

在这里插入图片描述
类型错误,抛出的异常应该从baseexception派生在这里插入图片描述
上面两个是值,下面是noyimplementederror是一个class在这里插入图片描述在这里插入图片描述
所有的class,type的时候 显示type,因为在python3全是新式类
这两个是单值在这里插入图片描述
这是一个特殊的单值,未实现
在这里插入图片描述在这里插入图片描述
别看点进去是=none,但实际上只是给你看,并不是真正实现的东西在这里插入图片描述在这里插入图片描述
单值也是对象,也是有内存地址的,跟我们看到的none不是同一个东西在这里插入图片描述
**上面是未实现的值,下面是异常类型,类的类型是type,实例的类型是自己 的class,一切类型中的类型是type,对于实例自己的类型就是class,实例的继承路线是走的mro,最终祖先object,类型和继承是两个东西 **
在这里插入图片描述
调用这个类的无参构造器,抛出一个实例来在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
这样调用的是iadd在这里插入图片描述
调用add
在这里插入图片描述
把中间加号看到对应方法即可在这里插入图片描述在这里插入图片描述
实现 了add方法在这里插入图片描述
有问题,调用的是1 add在这里插入图片描述
整型几乎所有的算术方法都实现了在这里插入图片描述
字符串的就能这么做
在这里插入图片描述
int里是有add方法的在这里插入图片描述
B没实现add,所以反而去调用A的add方法在这里插入图片描述在这里插入图片描述
实现不实现不是问题的根本,还有东西在这里插入图片描述
B未实现,尝试反向调用A来实现,反向的记录很重要,B-A和A-B是不一样的在这里插入图片描述
现在实现一下B的add方法,同类型加法,进不来返回none
在这里插入图片描述
同类型相加,不同类型告诉未实现在这里插入图片描述
如果在加法的时候,第一个操作数加上第二个操作数,会调用第一个操作数.__add__方法(第二个操作数),但是如果对应的方法没有实现,只能尝试使用第二操作数的反向调用,.radd(第一操作数),如果radd也没有实现,直接抛出异常,这两个东西操作不了,因为你的操作符不支持这个
如果有add方法但是返回的是特殊的单值,notimplemented,虽然调用了,但是还是没实现

在这里插入图片描述
return这个特殊的单值之后,转而调用第二操作数的反向操作方法在这里插入图片描述在这里插入图片描述
整型发现后面的不是整型,不知道该跟你怎么相加
在这里插入图片描述
虽然字符串是3打印出来了,'C’虽然实现了,但是发现和自己不同类型在这里插入图片描述
这两个绝对不是同一个的东西
在这里插入图片描述
c的add如果未实现转而反向调用a的radd方法在这里插入图片描述
现在如果要把a+1实现
在这里插入图片描述
用try方法可以,也可以用hasattr,也可以用int转换,如果出现异常,就认定不是能加的数字,抛出异常,或者默认+0在这里插入图片描述
但是这么写解决不了这个问题在这里插入图片描述
转一下即可
在这里插入图片描述

这样就可以
在这里插入图片描述
这样return a+1就跑上面去了在这里插入图片描述
整型也需要解决就i需要用try捕获试试,转换int失败就为0,如果有other这个属性就直接+即可,如果没有这个属性,就认为是进行强制类型转换的
在这里插入图片描述
调用iadd方法有没有调用add方法你直接清楚在这里插入图片描述
只要实现一个就可以搞定其他的场景,复用在这里插入图片描述

运算符重载在python中会简化你的操作,而且符合一般人使用的方式,比如购物车添加商品,cart.add(item),或是cart+item+item,这三个都是等价的,在内部实现一个直接调用即可
在这里插入图片描述
重载是把父类的干掉,自己来实现,继承,封装,多态在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
notimplemented是单值在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
写一个无限计数器试试
在这里插入图片描述
继续向后拿
在这里插入图片描述
下面的相当于重新构造一个生成器对象在这里插入图片描述
send方法是发送给生成器对象,这个等式先执行右边的语句,yield的时候,函数暂停执行,赋值就卡在那里了,这时候等下一次的拨一次转一次在这里插入图片描述
只要拨一下看到a就说明赋值成功,但是什么都看不到在这里插入图片描述
但是第二次就能看到了,next可以把当前生成器yield出来的值拿到,而print(等待yield带回来,现在没人给它交互),所以a什么都没拿到,等于none*在这里插入图片描述在这里插入图片描述
等式右边先计算,这个语句计算就卡住了,等式没赋值完成,有了base之后,下一次就在base的基础上进行计算
在这里插入图片描述
有了base之后,下一次就在base的基础上进行计算,如果是none就每次+1,不是none就在base的基础上+1在这里插入图片描述
这样就交互了在这里插入图片描述
如果是纯函数,可以用send方法交互,在这里插入图片描述
第一次的时候base停在这里,base没有值,send进去后。base拿到值在这里插入图片描述
send传进去一个值,同时把别人推着走,驱动前进,base拿到100,start=100+1。推进去值并且还能返回个值,相当于一个带交互的next,101yield出来,下面就拿到这个返回值 ,在这里插入图片描述
send用的地方非常少
在这里插入图片描述
send方法可以驱动整个生成器继续向下走,走一次碰到yield语句暂停,同时把send值传进来,等于是个表达式的值赋值给变量,就跟lambda表达式 赋值给一个变量是一个道理
要么函数执行完一般执行 ,要么下一次yield为止,下一次停下来拨一下转一下
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值