鱼C论坛

 找回密码
 立即注册
查看: 1766|回复: 22

请问关于继承列表与new魔法方法的问题

[复制链接]
发表于 2018-7-24 16:15:53 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
class Nlist(list):
    def __new__(cls,*args):
        print(type(args))
        return list.__new__(cls,tuple(set(list(args))))
    def apppend(self,value):
        if value not in self:
            return list.append(self,value)
nn = Nlist(1,2,3,4,1,2,3)

报错如下:
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    nn = Nlist(1,2,3,4,1,2,3)
TypeError: list expected at most 1 arguments, got 7

请问为什么会报错,我传给list的明明是一个元组啊,和那个*args一样不是么,假如把第四行删除换成别的就可以。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-24 17:29:27 | 显示全部楼层
list expected at most 1 arguments, got 7:
列表期待最多1个参数,却获得了7个。
这说明用元组初始化列表会把元组中的每一个数据填进list()。
所以建议一个个append。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-24 22:16:23 | 显示全部楼层
无符号整形 发表于 2018-7-24 17:29
list expected at most 1 arguments, got 7:
列表期待最多1个参数,却获得了7个。
这说明用元组初始化列 ...

可是为什么直接用list将元组转换为列表却可以呢,比如list((1,2,3,4)),这里传进去的不也是一个元组吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-24 22:17:56 | 显示全部楼层
蛊惑的心 发表于 2018-7-24 22:16
可是为什么直接用list将元组转换为列表却可以呢,比如list((1,2,3,4)),这里传进去的不也是一个元组吗

额 貌似列表 元组 集合的__new__方法都是只接受1个参数的哦·
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 14:19:40 | 显示全部楼层
无符号整形 发表于 2018-7-24 22:17
额 貌似列表 元组 集合的__new__方法都是只接受1个参数的哦·

可是我这次只给了一个参数还是不行,我将return后面的代码改成了1,就是那个元组,直接将它换成1也不行,虽然没有报错,但是返回的却是一个空列表,而不是我想要的[1]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 15:02:00 | 显示全部楼层
蛊惑的心 发表于 2018-7-25 14:19
可是我这次只给了一个参数还是不行,我将return后面的代码改成了1,就是那个元组,直接将它换成1也不行, ...

这种内部的东西最好不要理啦~Python奇怪的东西多着呢
建议直接返回列表。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 15:44:56 | 显示全部楼层
无符号整形 发表于 2018-7-25 15:02
这种内部的东西最好不要理啦~Python奇怪的东西多着呢
建议直接返回列表。

好吧,我只是担心会不会有什么我没有想到的东西在__new__里,而我又没有写,导致一些问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 17:54:21 | 显示全部楼层
蛊惑的心 发表于 2018-7-25 15:44
好吧,我只是担心会不会有什么我没有想到的东西在__new__里,而我又没有写,导致一些问题

直接返回*args即可啦~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:06:08 | 显示全部楼层
无符号整形 发表于 2018-7-25 17:54
直接返回*args即可啦~

直接返回*args确实可以,而且a = Nlist((1,1,2,3,4,4))也能运行了,但是,以下代码却无法正常运行:
class Nlist(list):
    def __new__(cls,*args):
        args=tuple(set(list(args)))
        return list.__new__(cls,*args)
    def apppend(self,value):
        if value not in self:
            return list.append(self,value)

a = Nlist((1,1,2,3,4,4))
我试图对*arg进行修改,但是不行直接这样写*args=tuple(set(list(args)))则会报错。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:09:30 | 显示全部楼层
无符号整形 发表于 2018-7-25 17:54
直接返回*args即可啦~

不对啊。。我就args前面的*去掉了,变成了这样:
class Nlist(list):
    def __new__(cls,args):
        args=tuple(set(list(args)))
        print(args)
        return list.__new__(cls,args)
    def apppend(self,value):
        if value not in self:
            return list.append(self,value)

a = Nlist((1,1,2,3,4,4))
它还是没有反应,没理由啊。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 18:13:44 | 显示全部楼层
额,你去掉*干嘛?去掉的话这个就跟list((1,1,2,3,4,4))差不多一样了啊……
而且你传给*args的是一个元组自然无法修改。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:19:44 | 显示全部楼层
无符号整形 发表于 2018-7-25 18:13
额,你去掉*干嘛?去掉的话这个就跟list((1,1,2,3,4,4))差不多一样了啊……
而且你传给*args的是一个元组 ...

我想将传给
Nlist的参数去重,所以需要对传入的数据进行修改,但是*arg是不知道怎么修改,所以我就将它变成了args,但是不行
这是我理解的过程,你看看有什么问题吗:
首先将一个元组作为args传入,对元组去重再赋值给args,将新的args给list
所以我得到的应该是一个去重了的列表,而不是好像修改args这一过程没有作用。。
以下是代码(不用再次实例化了):
class Nlist(list):
    def __new__(cls,args):
        args=tuple(set(list(args)))
        print(args)
        return list.__new__(cls,args)
    def apppend(self,value):
        if value not in self:
            return list.append(self,value)

a = Nlist((1,1,2,3,4,4))
print(a)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 18:26:41 | 显示全部楼层
蛊惑的心 发表于 2018-7-25 18:19
我想将传给
Nlist的参数去重,所以需要对传入的数据进行修改,但是*arg是不知道怎么修改,所以我就将它 ...

嗯嗯,对的。
去重的话这样可以。
其实*args也是可以的,只要tuple(set(args))就可以了。
参数是可变的话是可以这样做的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:45:07 | 显示全部楼层
无符号整形 发表于 2018-7-25 18:26
嗯嗯,对的。
去重的话这样可以。
其实*args也是可以的,只要tuple(set(args))就可以了。

可问题是不行啊。。。你运行一下,得到的结果不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 18:52:58 | 显示全部楼层
蛊惑的心 发表于 2018-7-25 18:45
可问题是不行啊。。。你运行一下,得到的结果不对

额,这个我也不知道了
那就用if in去重吧
帮你召唤大佬@冬雪雪冬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-25 18:55:06 | 显示全部楼层
无符号整形 发表于 2018-7-25 18:52
额,这个我也不知道了
那就用if in去重吧
帮你召唤大佬@冬雪雪冬

好吧,谢谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 19:25:26 | 显示全部楼层

看来list.__new__确实不支持*args,直接返回列表吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 19:44:03 | 显示全部楼层
无符号整形 发表于 2018-7-25 18:52
额,这个我也不知道了
那就用if in去重吧
帮你召唤大佬@冬雪雪冬

我也没弄清楚,
1.直接return是可以的:
  1. class Nlist(list):
  2.     def __new__(cls,*args):
  3.         return list(set(args))
  4. nn = Nlist(1,2,3,4,1,2,3)
复制代码


2.简单变量调用父类的new也是可以的:
  1. class N(int):
  2.     def __new__(cls, x):
  3.         x = -x
  4.         return super().__new__(cls, x)
复制代码


3.用init写是可以的:
  1. class Nlist(list):
  2.     def __init__(self, *args):
  3.         return super().__init__(set(args))
复制代码


召唤大神吧, @小甲鱼 @~风介~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 19:44:59 | 显示全部楼层
冬雪雪冬 发表于 2018-7-25 19:44
我也没弄清楚,
1.直接return是可以的:

逐级上报,哈哈~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-25 20:14:27 | 显示全部楼层

功力不行,只好召唤大神了。

点评

嗯嗯,我也是,哈哈~  发表于 2018-7-25 20:27
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-31 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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