鱼C论坛

 找回密码
 立即注册
查看: 1749|回复: 7

[已解决]类和对象关于重写new的时候,return部分的问题

[复制链接]
发表于 2020-3-8 00:19:19 | 显示全部楼层 |阅读模式

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

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

x
class C:
        def __new__(cls,s):
                return int.__new__(int,s)

        
>>> C(1)
1
>>> class C:
        def __new__(cls,s):
                return str.__new__(str,s)

        
>>> C(1)
'1'
>>> class C:
        def __new__(cls,s):
                return list.__new__(list,s)

        
>>> C(1)
[]
看上面三个类,为啥最后一个输出的是一个空列表
最佳答案
2020-3-8 10:52:59
本帖最后由 jackz007 于 2020-3-8 10:56 编辑
十月故里 发表于 2020-3-8 07:17
大佬你好,你的这个写法我清楚,return这一部分括号里面的cls和def括号里面的cls一样的时候,传入的是这 ...


        新建一个对象需要一系列配套操作,但是,由于 Python 的对象模型并不透明,具体都有哪些操作,我们无从知道。但是,有一点是肯定的,那就是,一定会调用自己的魔法函数 __new__()。你的情况我想应该这样来理解,你新写的魔法函数 __new__() 只是在退出的时候调用了其它类的同名魔法函数,只是完成了创建对象一系列配套操作当中的一部分,因此,对象表现不正常应该是情理之中的事情。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-8 01:38:24 | 显示全部楼层
本帖最后由 jackz007 于 2020-3-8 01:39 编辑
class A(int):
    def __new__(cls , s):
        return int . __new__(cls , s)

class B(str):
    def __new__(cls , s):
        return str . __new__(cls , s)

class C(list):
    def __new__(cls , s):
        return list . __new__(cls , s)

print(A(1))
print(B(1))
print(C([1]))
       要重载魔法函数 __new__(),所属的类必须首先继承自某个已有的类,只有这样,新的类才能继承父类的所有属性和方法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-8 07:17:35 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-3-8 01:38
要重载魔法函数 __new__(),所属的类必须首先继承自某个已有的类,只有这样,新的类才能继承父类 ...

大佬你好,你的这个写法我清楚,return这一部分括号里面的cls和def括号里面的cls一样的时候,传入的是这个类的参数,然后你再看我写的,如果不一样的时候,会有不同的效果,我现在是纠结为什么如果是list的话,会输出空列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-8 07:21:22 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-3-8 01:38
要重载魔法函数 __new__(),所属的类必须首先继承自某个已有的类,只有这样,新的类才能继承父类 ...

另外我这里没有用继承,我只是直接return给别的类调用,看看参数传递情况。按你的说法的话,第一第二个类应该是没输出,但实际情况是有输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 08:29:37 | 显示全部楼层
先去继承int,str,list类,再去重写__new__()。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-8 10:03:00 | 显示全部楼层
iltifa 发表于 2020-3-8 08:29
先去继承int,str,list类,再去重写__new__()。

感谢大佬的回答,new的用法我是清楚的,上面的例子也可以写继承的,然后重写new之后,会出现我提到的例子,我就是这样发现的问题,然后为了抛开一些影响的因素,我把一些不影响结果的代码去掉了,比如继承的东西,就专门关注这个new,
我这里只是好奇,int,str的输出为啥会和list输出的不一样,按理说,list应该会输出一个非空列表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 10:52:59 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-8 10:56 编辑
十月故里 发表于 2020-3-8 07:17
大佬你好,你的这个写法我清楚,return这一部分括号里面的cls和def括号里面的cls一样的时候,传入的是这 ...


        新建一个对象需要一系列配套操作,但是,由于 Python 的对象模型并不透明,具体都有哪些操作,我们无从知道。但是,有一点是肯定的,那就是,一定会调用自己的魔法函数 __new__()。你的情况我想应该这样来理解,你新写的魔法函数 __new__() 只是在退出的时候调用了其它类的同名魔法函数,只是完成了创建对象一系列配套操作当中的一部分,因此,对象表现不正常应该是情理之中的事情。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-8 12:24:08 | 显示全部楼层
jackz007 发表于 2020-3-8 10:52
新建一个对象需要一系列配套操作,但是,由于 Python 的对象模型并不透明,具体都有哪些操作, ...

恩恩,只能这样理解了目前,不过也只是一个好奇,毕竟正常写new不会这样写,这应该涉及到py的执行模块是怎么运行才可能知道为啥这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 12:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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