鱼C论坛

 找回密码
 立即注册
查看: 3304|回复: 8

[已解决]关于重载__lshift__(self,other)的问题

[复制链接]
发表于 2017-8-27 23:10:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小六12 于 2017-8-28 13:34 编辑
  1. class Nstr(str):
  2.     def __lshift__(self,other):
  3.         return self[other-1:]+self[:other-1]
  4.     #为何这里如果写成self=self[other-1:]+self[:other-1]就不行呢
  5.     #就还是不会改变self的值呢?
  6.     def __rshift__(self,other):
  7.         return self[-other:]+self[:-other]
复制代码

图片是将 return self[other-1:]+self[:other-1]改成self=self[other-1:]+self[:other-1]后的结果
最佳答案
2017-8-28 09:11:57
self=self[other-1:]+self[:other-1]不行是因为self本来就是代表自身的的对象,你重新赋值对象,那么你如何使用这个对象的方法呢?
你实例类后的对象,能够直接输出是因为另一种魔法方法,而不是输出对象本身的,str类对象实际是输出该对象的某个成员的值,你要继承str类,你先得了解这个类的主要成员
QQ截图20170827230938.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-28 09:11:57 | 显示全部楼层    本楼为最佳答案   
self=self[other-1:]+self[:other-1]不行是因为self本来就是代表自身的的对象,你重新赋值对象,那么你如何使用这个对象的方法呢?
你实例类后的对象,能够直接输出是因为另一种魔法方法,而不是输出对象本身的,str类对象实际是输出该对象的某个成员的值,你要继承str类,你先得了解这个类的主要成员
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-28 09:18:12 | 显示全部楼层
2017-08-28_091309.png

2017-08-28_091529.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-8-28 12:34:11 | 显示全部楼层
lumber2388779 发表于 2017-8-28 09:11
self=self[other-1:]+self[:other-1]不行是因为self本来就是代表自身的的对象,你重新赋值对象,那么你如何 ...

感谢回答!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-28 13:32:39 | 显示全部楼层
lumber2388779 发表于 2017-8-28 09:11
self=self[other-1:]+self[:other-1]不行是因为self本来就是代表自身的的对象,你重新赋值对象,那么你如何 ...

这里,我再提出一点我的看法,self的值和类型都没有改变是因为在调用函数的时候对全局变量进行赋值操作的时候,python为了保护全局变量将它暂时屏蔽起来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-28 14:50:03 | 显示全部楼层
小六12 发表于 2017-8-28 13:32
这里,我再提出一点我的看法,self的值和类型都没有改变是因为在调用函数的时候对全局变量进行赋值操作的 ...

我的理解是实际实现是当你在内部函数修改该类对象时会直接抛出异常,因为这是不合理的,应该不是屏蔽,python虽然是很强大的语言,但在很多实现部分可能无法理解,我个人觉得有点C/C++的底子来理解python的面向对象比较好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-28 15:48:42 | 显示全部楼层
lumber2388779 发表于 2017-8-28 14:50
我的理解是实际实现是当你在内部函数修改该类对象时会直接抛出异常,因为这是不合理的,应该不是屏蔽,pyt ...

可是实际运行的时候就是没有抛出异常啊。我的图片结果都出现了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-28 15:57:47 | 显示全部楼层
小六12 发表于 2017-8-28 15:48
可是实际运行的时候就是没有抛出异常啊。我的图片结果都出现了。

请看图片,实例化操作和移位操作都可以运行,且没有改变类型
QQ截图20170828155523.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-29 09:34:21 | 显示全部楼层
小六12 发表于 2017-8-28 15:57
请看图片,实例化操作和移位操作都可以运行,且没有改变类型

不大清楚内部实现,估计得去看下CPython才能清楚了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 12:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表