鱼C论坛

 找回密码
 立即注册
查看: 2328|回复: 10

魔法方法__new__, 傻傻弄不清

[复制链接]
发表于 2017-1-24 09:59:16 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 Little.L 于 2017-1-24 09:59 编辑

QQ截图20170124095211.png
1.class CapStr(  )  括号里难道不应该是类么?为什么可以写str 呢?
2. def __new__(cls, string)   里的string 跟 str 又是什么关系呢?
3. __new__魔法方法需要返回一个实例对象, 那str.__new__(cls,string)是一个实例对象?

最佳答案

查看完整内容

首先申明...本人也是新人 也还有好多不明白的地方,如果有错...请担待 1. CapStr是str的子类,str是父类(就是爸爸和儿子的关系,基类就是爸爸,子类就是儿子),如果你学了小甲鱼的课你就知道...子类可以直接调用基类的方法, 转换成通俗的话来说就是儿子可以使用爸爸所有的东西 回答你的问题:应该, str本质上也是个类 PS:如果CapStr()的括号里没有str也就是说没有继承str类,那么其实也是继承了一个类,就是object类,这个obje ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-24 09:59:17 | 显示全部楼层
本帖最后由 Kiopler 于 2017-1-30 20:52 编辑

首先申明...本人也是新人 也还有好多不明白的地方,如果有错...请担待

1. CapStr是str的子类,str是父类(就是爸爸和儿子的关系,基类就是爸爸,子类就是儿子),如果你学了小甲鱼的课你就知道...子类可以直接调用基类的方法, 转换成通俗的话来说就是儿子可以使用爸爸所有的东西
回答你的问题:应该, str本质上也是个类

PS:如果CapStr()的括号里没有str也就是说没有继承str类,那么其实也是继承了一个类,就是object类,这个object可以不写出来,默认的,因为__new__都是object类的后代,据说这是历史问题,具体我也不清楚

2.__new__魔法方法指的是第一个被执行的魔法方法,它的作用是给__init__魔法方法传递类实例对象(这个类实例对象会传入cls,__new__在把cls传递给__init__的self),如果__new__不进行传递或者没有类实例对象,那么__init__魔法方法也不会执行
现在回答你的问题:string是str这个类的对象

3.__new__方法不一定要返回一个对象,如果需要__init__方法执行那么就需要返回一个对象,所以你说的也是对的....不然要__init__来干嘛..
回答你的问题:...,你都说了__new__需要返回一个实例对象,那后半个问题没什么意义了... 你可以
return 父类.__new__(cls,string) 也可以 return object.__new__(cls,string) ,具体看你是否有继承父类

用小甲鱼老师的一句话就是...python无处不对象... .....实例当然也可以是对象了...

本人也没学多久....如有错误...请见谅哈...





评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Little.L + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-24 14:55:32 | 显示全部楼层
1、str是个类,这个可以自行查看下。
2、string是个变量名,你随意起都行,这应该没啥问题。
3、第一,__new__没说一定要返回一个实例这个你可以查看官方文档,第二,实例是实例,对象是对象,实例对象我不清楚你指的是什么。最后str.__new__(cls,string)返回的应该不是一个实例或者对象。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-1-30 20:50:06 | 显示全部楼层
我回答的可是很认真的....各个手敲,就把fishB给我吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-3 17:22:47 | 显示全部楼层
Kiopler 发表于 2017-1-24 09:59
首先申明...本人也是新人 也还有好多不明白的地方,如果有错...请担待

1. CapStr是str的子类,str是父类 ...

那请问 这里的 cls 是指新创建的这个 class  CapStr么?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-3 18:33:09 | 显示全部楼层
本帖最后由 Kiopler 于 2017-2-3 18:36 编辑
Little.L 发表于 2017-2-3 17:22
那请问 这里的 cls 是指新创建的这个 class  CapStr么?


不是哦...应该是指实例化的对象,是在参数在实例化的时候IDLE自动提供的,也就是说 如果 在IDLE里打
a = CapStr('xxxxx'), cls 代表的就是这个a即实例化对象
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-3 18:54:47 | 显示全部楼层
Kiopler 发表于 2017-2-3 18:33
不是哦...应该是指实例化的对象,是在参数在实例化的时候IDLE自动提供的,也就是说 如果 在IDLE里打
a = ...

我觉得应该不是诶
__new__ 魔法方法本身需要返回的是的一个实例对象
所以实例化对象a是new 的产物
所以我的理解是cls 是new 所对应的类
因此在 def __new __(cls,string) 中,cls指的是class CapStr
而在str.__new__(cls,string )中,cls指的是str

并不知道自己思考得对不对.....
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-3 20:19:18 | 显示全部楼层
本帖最后由 Kiopler 于 2017-2-3 20:20 编辑
Little.L 发表于 2017-2-3 18:54
我觉得应该不是诶
__new__ 魔法方法本身需要返回的是的一个实例对象
所以实例化对象a是new 的产物


结合你说的和我在网上在查查其他资料发现你说的是对的

但是有一点...
个人认为cls与Capstr这个类是无关系的,应该与父类或者object类有关,即实例化的类应该是继承父类或者object类
  1. class Capstr(str): #有str父类则可以选择实例化str,没有则默认object类
  2.     def __new__(cls,string):
  3.             string = string.upper()
  4.             return str.__new__(cls,string)
复制代码

测试:
>>> issubclass(Capstr,object)  #判别Capstr是否为object类的子类
True

结论:
Capstr是object的子类,__new__方法的确需要返回一个实例对象,即返回一个实例化的实例,在return str.__new__string(cls,string),这里已经实例化的应该是父类str的实例,所以应该指代的是str

即cls指代的应该只有object类或者是继承的父类..

我感觉在 def __new__(cls,string)中cls应该还没有进行确定..应该到return才能确定是继承object类还是父类吧...

不管如何...学习啦,谢谢楼主




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-4 08:20:33 | 显示全部楼层
Kiopler 发表于 2017-2-3 20:19
结合你说的和我在网上在查查其他资料发现你说的是对的

但是有一点...

是我谢谢你啦,感觉学到很多
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-3-6 15:08:20 | 显示全部楼层
好抽象 好难理解__new__方法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-16 16:15:16 | 显示全部楼层
snakeshe 发表于 2017-3-6 15:08
好抽象 好难理解__new__方法

感觉__new__方法需要仔细按照计算机逻辑推一遍才弄得清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-25 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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