鱼C论坛

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

[已解决]python中的__new__问题

[复制链接]
发表于 2020-7-12 23:05:50 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 超级大的甲鱼 于 2020-7-12 23:13 编辑
class Rstr(str):
    def __new__(cls,word):
         return str.__new__(cls,word)
例如这一段,为什么需要返回str.__new__()?这个父类的__new__为什么是一个实例化对象呢?
c = Rstr()中的c不是才应该是实例化对象吗?求大佬帮忙解答一下啊!!
class Capstring(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls,string)
还有这段,return的如果是父类的实例化对象,为什么会有参数string呢?
最佳答案
2020-7-12 23:53:45
超级大的甲鱼 发表于 2020-7-12 23:50
就是说只有实例化的时候__new__才会传实例化对象给__init__吗?



实例对象创建过程中调用的是 __new__,然后实例化创建后调用的就是 __init__了

当 __new__ 实例对象创建完成,就会自动将实例化对象传递给 __init__方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-7-12 23:09:36 | 显示全部楼层
我在网上又看了一些讲解,我理解是return父类的__new__是因为这个new原本return了一个实例化对象,请问我理解的对不对呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 23:14:16 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-12 23:17 编辑




例如这一段,为什么需要返回str.__new__()?


你的这一段代码这样设置没有意义,因为默认 __new__ 都是继承了 str 的 __new__ 方法,而你重写了 __new__方法却什么都没有改变...那不就等于直接继承了


你这样改还有些意义:
class Rstr(str):
    def __new__(cls,word):
        print(word)
        return str.__new__(cls,word)

r = Rstr('111')

这样改了下,至少使得魔法方法每次调用时候会打印你传入的参数,这就是等于在 父类 str 的 __new__ 上增加了打印参数的功能,而同时我们 str.__new__(cls) 调用了 父类str 的__new__方法

说明就是在原有 str 类的  __new__ 方法新增了 打印传入参数的功能


这个父类的__new__为什么是一个实例化对象呢?


__new__ 是魔法方法,不是实例对象,而__new__ 函数的功能是将实例化对象和设置的参数传递给 __init__

而且 __new__ 方法可以设置返回值,而__init__方法不能设置返回值

c = Rstr()中的c不是才应该是实例化对象吗?


这里的 c 就是 Rstr() 类的实例化对象



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 23:31:29 | 显示全部楼层
Twilight6 发表于 2020-7-12 23:14
你的这一段代码这样设置没有意义,因为默认 __new__ 都是继承了 str 的 __new__ 方法,而你重写 ...

我从网上查的说__new__必须要有返回值,返回实例化出来的实例,
class Rstr(str):
    def __new__(cls,word):
        print(word)
        return str.__new__(cls,word)

r = Rstr('111')
这里面返回的实例是什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 23:44:02 | 显示全部楼层
超级大的甲鱼 发表于 2020-7-12 23:31
我从网上查的说__new__必须要有返回值,返回实例化出来的实例,这里面返回的实例是什么呢?


Rstr('111') 这个就是你的实例化,这里的 __new__ 就是将这个实例化对象传递给了 __init__,我上面一楼也有说,你认真看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 23:50:14 | 显示全部楼层
Twilight6 发表于 2020-7-12 23:44
Rstr('111') 这个就是你的实例化,这里的 __new__ 就是将这个实例化对象传递给了 __init__,我上面一楼 ...

就是说只有实例化的时候__new__才会传实例化对象给__init__吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 23:53:45 | 显示全部楼层    本楼为最佳答案   
超级大的甲鱼 发表于 2020-7-12 23:50
就是说只有实例化的时候__new__才会传实例化对象给__init__吗?



实例对象创建过程中调用的是 __new__,然后实例化创建后调用的就是 __init__了

当 __new__ 实例对象创建完成,就会自动将实例化对象传递给 __init__方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 23:55:39 | 显示全部楼层
Twilight6 发表于 2020-7-12 23:53
实例对象创建过程中调用的是 __new__,然后实例化创建后调用的就是 __init__了

当 __new__ 实例对 ...

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-12 23:58:31 | 显示全部楼层

客气了 早点休息吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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