鱼C论坛

 找回密码
 立即注册
查看: 1568|回复: 17

[已解决]关于__new__魔法方法其他参数传入的一些问题

[复制链接]
发表于 2020-4-1 21:40:31 | 显示全部楼层 |阅读模式

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

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

x
python3.3 以上版本的新式类中,如何在同时覆盖 __new__ 和 __init__ 时,将自定义的额外参数从 __new__ 传入 __init__ ?按我对new方法的理解不是可以处理一下传进来的参数吗,可为什么会出现图片中的问题,难道new方法只能处理不可改变类型的参数?
>>> class CapStr():
        def __init__(self,n):
                self.n=n
        def __new__(cls,n):
                n=10+n
                return super().__new__(cls,n)

       
>>> a=CapStr(10)
Traceback (most recent call last):
  File "<pyshell#60>", line 1, in <module>
    a=CapStr(10)
  File "<pyshell#59>", line 6, in __new__
    return super().__new__(cls,n)
TypeError: object.__new__() takes exactly one argument (the type to instantiate)
最佳答案
2020-4-2 16:55:33
秃头小宝贝 发表于 2020-4-2 16:47
那这个分数类应该要继承 float之类的类把,我以前是这样认为的,参数n先传给new 然后new处理后再return给 ...

不会继承自float,而是继承自 numbers.Rational

__new__ 接收到的参数和 __init__ 接收到的是同一个对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-1 21:44:37 | 显示全部楼层
调用 super() 的 __new__() 不需要加 n。
>>> class CapStr():
        def __init__(self,n):
                self.n=n
        def __new__(cls,n):
                n=10+n
                return super().__new__(cls)

        
>>> a=CapStr(10)
>>> a
<__main__.CapStr object at 0x000001DFC5E23A00>
>>> a.n
10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-1 23:31:00 | 显示全部楼层
class T:

    def __init__(self, n):
        self.n = n

    def __new__(cls, *args, **kwargs):
        cls.nn = 20
        return super().__new__(cls)

t=T(10)
print(t.nn)
print(T.nn)
#print(T.n)

处理后,就地添加,cls代表的就是类本身,self代表的就是实例化对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 10:13:28 | 显示全部楼层
zltzlt 发表于 2020-4-1 21:44
调用 super() 的 __new__() 不需要加 n。

如果是先调用 new 为什么 传入的参数n没有经过处理 +10变成20呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 10:16:20 | 显示全部楼层
Stubborn 发表于 2020-4-1 23:31
处理后,就地添加,cls代表的就是类本身,self代表的就是实例化对象。

就是在new中传入的参数是类属性吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 10:17:06 | 显示全部楼层
秃头小宝贝 发表于 2020-4-2 10:13
如果是先调用 new 为什么 传入的参数n没有经过处理 +10变成20呢

给init和new传入的参数是一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 10:20:27 | 显示全部楼层
建议去看一下fractions模块的源代码,你应该就能懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 11:08:17 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 10:20
建议去看一下fractions模块的源代码,你应该就能懂了

好长一段呀 我仔细看 他好像没有重载__init__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 11:12:11 | 显示全部楼层
秃头小宝贝 发表于 2020-4-2 11:08
好长一段呀 我仔细看 他好像没有重载__init__

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

使用道具 举报

发表于 2020-4-2 11:12:55 | 显示全部楼层
秃头小宝贝 发表于 2020-4-2 10:16
就是在new中传入的参数是类属性吗

不是,给__new__传的参数完全取决于代码怎么写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 11:44:16 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 11:12
不是,给__new__传的参数完全取决于代码怎么写

可以加你一下吗 这个问题困扰我好几天了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 11:45:43 | 显示全部楼层
秃头小宝贝 发表于 2020-4-2 11:44
可以加你一下吗 这个问题困扰我好几天了

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

使用道具 举报

 楼主| 发表于 2020-4-2 12:14:39 | 显示全部楼层

他说我没有权限加好友 你加我qq把 569522162
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 15:48:53 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 11:12
不是,给__new__传的参数完全取决于代码怎么写

我好像有点理解了 ,我的理解是这样的,__new__主要是当继承一些不可变量的时候用来修改传进来的参数的,比如小甲鱼那个视频拿字符串来做例子,然后这种类实例后自己就是一个对象 比如所a=A() a自己就是一个对象而不像是__init__一样只是初始化一些属性,而像三楼那样的用法中cls.nn是往类中加入一个类属性,请问我这样理解没错把。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 15:53:05 | 显示全部楼层
秃头小宝贝 发表于 2020-4-2 15:48
我好像有点理解了 ,我的理解是这样的,__new__主要是当继承一些不可变量的时候用来修改传进来的参数的, ...

有这样的用法。
还有一种用法,比如说你要写一个分数类,当分子和分母约分后为0时返回一个整数,这是__init__做不到的,只能用__new__来实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 16:47:17 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 15:53
有这样的用法。
还有一种用法,比如说你要写一个分数类,当分子和分母约分后为0时返回一个整数,这是__i ...

那这个分数类应该要继承 float之类的类把,我以前是这样认为的,参数n先传给new 然后new处理后再return给init现在想想应该是错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-2 16:55:33 | 显示全部楼层    本楼为最佳答案   
秃头小宝贝 发表于 2020-4-2 16:47
那这个分数类应该要继承 float之类的类把,我以前是这样认为的,参数n先传给new 然后new处理后再return给 ...

不会继承自float,而是继承自 numbers.Rational

__new__ 接收到的参数和 __init__ 接收到的是同一个对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-2 17:34:53 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-2 16:55
不会继承自float,而是继承自 numbers.Rational

__new__ 接收到的参数和 __init__ 接收到的是同一个对 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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