鱼C论坛

 找回密码
 立即注册
查看: 1786|回复: 6

new方法的参数问题

[复制链接]
发表于 2017-9-3 23:26:18 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
__new__(cls[, ...]) cls之后的参数什么情况下需要写出来。 如果init方法中有相同参数,那么cls之后还需要再写一遍吗? 返回父类new中的参数除了cls还需要写什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-9-3 23:35:03 | 显示全部楼层
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-3 23:46:28 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-9-3 23:35
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法

就是说init也重写 里面有了相同的参数 new中的参数可写可不写?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-3 23:55:42 | 显示全部楼层
s1dney 发表于 2017-9-3 23:46
就是说init也重写 里面有了相同的参数 new中的参数可写可不写?

其他的参数是用来直接传递给 __init__ 方法

这不是说得很明白了吗?什么重写不重写的。写了就传了,没有写就不传。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-4 00:03:19 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-9-3 23:55
其他的参数是用来直接传递给 __init__ 方法

这不是说得很明白了吗?什么重写不重写的。写了就传了,没 ...

class Foo(object):
    def __init__(self, *args, **kwargs):
        ...
    def __new__(cls, *args, **kwargs):
        return object.__new__(cls, *args, **kwargs)   

csdn上看到的一段 这种情况下new里面的*args和**kwargs可以省略吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-4 00:05:31 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-9-3 23:55
其他的参数是用来直接传递给 __init__ 方法

这不是说得很明白了吗?什么重写不重写的。写了就传了,没 ...

def __new__(cls, *args, **kwargs):
   ...
   return object.__new__(cls)

因为有时候他还会来这么一段代码 所以我不太清楚cls后面的参数具体什么时候可以不写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-6 15:42:03 | 显示全部楼层
s1dney 发表于 2017-9-4 00:03
class Foo(object):
    def __init__(self, *args, **kwargs):
        ...

举个实际例子,你运行一下就知道了:
  1. class CS(str):
  2.         def __new__(cls,string):
  3.             print('new')
  4.             string=string.upper()
  5.             return str.__new__(cls,string)
  6. ##            return str.__new__(cls)

  7.         def __init__(self,string='aaa'):
  8.             print('init')
  9.             self.string=string
复制代码


输出结果为:
>>> c=CS('bbb')
new
init
>>> c
'BBB'
>>> c.string
'bbb'
>>>

第二个例子,不传参数:
  1. class CS(str):
  2.         def __new__(cls,string):
  3.             print('new')
  4.             string=string.upper()
  5. ##            return str.__new__(cls,string)
  6.             return str.__new__(cls)

  7.         def __init__(self,string='aaa'):
  8.             print('init')
  9.             self.string=string
复制代码


结果为:
>>> c=CS('bbb')
new
init
>>> c
''
>>> c.string
'bbb'
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-10 06:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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