鱼C论坛

 找回密码
 立即注册
查看: 1691|回复: 4

[已解决]一个__new__有关的问题

[复制链接]
发表于 2021-6-15 17:06:24 | 显示全部楼层 |阅读模式

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

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

x
class Test(list):
    def __new__(cls,*x):
        print(x)
        return list.__new__(cls,x)
    def __init__(self,*x):
        self.L=self
>>> a=Test('a','b','c')
('a', 'b', 'c')
>>> a
[]
>>> a.L
[]


请问这里返回的为什么是个空值?
最佳答案
2021-6-15 17:13:26
list是在初始化的时候添加值,而不是实例化时。
所以要这样写:
class Test(list):
    def __new__(cls,*x):
        print(x)
        return list.__new__(cls,x)                    
    def __init__(self,*x):
        super().__init__(x)
        self.L=self

a=Test('a','b','c')
print(a)
print(a.L)



其实这里__new__方法是没必要重写的,一般实际运用也很少重写__new__方法。可以改成下面这样:
class Test(list):                
    def __init__(self,*x):
        super().__init__(x)
        self.L=self

a=Test('a','b','c')
print(a)
print(a.L)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-15 17:13:26 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
list是在初始化的时候添加值,而不是实例化时。
所以要这样写:
class Test(list):
    def __new__(cls,*x):
        print(x)
        return list.__new__(cls,x)                    
    def __init__(self,*x):
        super().__init__(x)
        self.L=self

a=Test('a','b','c')
print(a)
print(a.L)



其实这里__new__方法是没必要重写的,一般实际运用也很少重写__new__方法。可以改成下面这样:
class Test(list):                
    def __init__(self,*x):
        super().__init__(x)
        self.L=self

a=Test('a','b','c')
print(a)
print(a.L)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-15 17:36:21 | 显示全部楼层
本帖最后由 fc5igm 于 2021-6-15 17:42 编辑
hrpzcf 发表于 2021-6-15 17:13
list是在初始化的时候添加值,而不是实例化时。
所以要这样写:


谢谢。
请问这里的new没必要写是因为
list是在初始化的时候添加值,而不是实例化时。

这个原因么?
另外请问对此的确定,除了两个都试试,还有什么别的办法么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-15 18:08:50 From FishC Mobile | 显示全部楼层
fc5igm 发表于 2021-6-15 17:36
谢谢。
请问这里的new没必要写是因为



对,类实例化时先调用new方法返回实例,接着调用init方法初始化。

一般不可变数据类型(比如str)的初始值是实例化时就确定了,可变数据类型(比如list)实例化是只是返回一个空实例,初始化时才将初始值添加到实例内,不过这是我个人的理解,也没严格验证过。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-15 18:14:19 | 显示全部楼层
hrpzcf 发表于 2021-6-15 18:08
对,类实例化时先调用new方法返回实例,接着调用init方法初始化。

一般不可变数据类型(比如str)的初 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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