鱼C论坛

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

041课,课后第2题,__new__函数的返回值问题。

[复制链接]
发表于 2019-9-25 00:09:50 | 显示全部楼层 |阅读模式

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

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

x
题目是:定义一个类,继承于int,实现的特殊功能是:当传入参数是字符串的时候,返回字符串所有ASCII码的和。
以下是代码对比,求解释new函数的返回值到底应该是啥~~?
我的代码是:
  1. class Nint(int):
  2.     def __new__(cls,value):
  3.         if str(value).isalpha():
  4.             count=0
  5.             for each in value:
  6.                 count+=ord(each)
  7.             return count     #我返回的是:值
  8.         
  9.         elif str(value).isdigit():
  10.             return value   
复制代码

小甲鱼的标准答案是:
  1. class Nint_Jiayu(int):
  2.     def __new__(cls,arg=0):
  3.         if isinstance(arg,str):
  4.             total=0
  5.             for each in arg:
  6.                 total+=ord(each)
  7.             arg=total
  8.         return int.__new__(cls,arg)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-9-25 00:38:50 | 显示全部楼层
本帖最后由 jackz007 于 2019-9-25 00:49 编辑

      如果我们不定义子类的 __new__() 方法,继承机制会在子类创建新对象的时候,自动调用父类的同名方法 int . __new__(),即便我们自己定义了该方法,实际上我们也不可能完全用自己编写的 __new__() 代替 int .__new__(),只不过继承机制给我们提供了一个机会,可以在 int .__new__() 被调用之前,可以对即将输入这个方法的参数进行必要的检测和改造,最终还得以调用 int . __new__() 为结束。

      所以,我们虽然可以定义子类的 __new__() 方法,却无法决定这个函数的返回值,最后的返回值还是得由父类的方法 int . __new__() 来决定。至于这个方法最后返回了什么,这个并不重要,我们一般并不需要关心。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-25 01:44:38 From FishC Mobile | 显示全部楼层
__new__函数的返回值是第一个参数cls的类型的实例,我们可以通过第二个参数提供它的初始值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-26 19:15:16 | 显示全部楼层
return count,一般他还是用了基本的加减法运算规则进行计算。而小甲鱼的是调用了int方法里的方法去计算。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-26 19:35:51 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2019-9-26 19:37 编辑

因为是int,所以没什么关系……
但还是建议用小甲鱼的方法,不是int就翻车了……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-19 14:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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