鱼C论坛

 找回密码
 立即注册
查看: 1770|回复: 8

[技术交流] 关于书本上__new__魔法方法问题求助

[复制链接]
发表于 2021-9-2 17:43:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 这道题太难了 于 2021-9-2 17:48 编辑

原文中代码如下:
  1. class CapStr(str):  #申明一个名字叫CapStr的类,继承str类的所有属性和方法。
  2.     def __new__(cls, string):
  3.         string = string.upper()
  4.         return str.__new__(cls, string)

  5. a = CapStr("I love fishC.com")
  6. print("使用__new__方法获得的类的对象的值为:%s,数据类型为:" % a, type(a))
复制代码

我自己又另外写了一个函数:
  1. def CapStr(string):
  2.     string = string.upper()
  3.     return string
  4. s = CapStr("I love fishC.com")
  5. print("使用函数方法获得的类的对象的值为:%s,数据类型为:" % s, type(s))
复制代码

运行结果如下:
  1. 使用__new__方法获得的类的对象的值为:I LOVE FISHC.COM,数据类型为: <class '__main__.CapStr'>
  2. 使用函数方法获得的类的对象的值为:I LOVE FISHC.COM,数据类型为: <class 'str'>
复制代码

综上所属,我有了一些自己的理解:各种数据类型(int、string、bool等)均属于一个个类,我们在创建类的时候特别是继承类的时候相当于创建了一个新的数据类型,不同之处在于我们自己创建的数据类型可以在父类的基础上进行修改。
在实际代码编写过程中调用方法都一样,都是通过a = CapStr("I love fishC.com")的方式来获取所需要的数据,只不过实现方式不一样:
使用__new__方法是在创建对象a时就直接得到了想要的值,使用函数方法则是让原对象通过运算得到。

所以我猜测,当需要大量获取此类值时,使用__new__方法比使用函数重复运算的方法效率要高。但如果数据量不大时,尤其对于新手而言,其实使用函数就够了也更不容易出错?不知道这么理解对不对?会不会存在一种只能使用__new__方法不能使用函数的情况?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-2 18:28:33 From FishC Mobile | 显示全部楼层
我理解是这两个都一样如果只是为了改大写字母,只不过定义类的话可以接着改写更多其他属性和方法。

新手,留给其他大佬评论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 11:54:50 | 显示全部楼层
你好  不知道你的问题解决没有 我也很疑惑,这里返回的是一个CapStr的类对象,但是打印的却是I LOVE FISHC.COM这样一个值,正常打印一个类对象的话不是应该都是一个对象的信息和地址吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-2 13:31:15 | 显示全部楼层
2392688470 发表于 2022-1-2 11:54
你好  不知道你的问题解决没有 我也很疑惑,这里返回的是一个CapStr的类对象,但是打印的却是I LOVE FISHC.CO ...

我的理解是:各种数据类型(int、string、bool等)均属于一个个类,我们在打印字符串型数据的时候,其实也就是打印字符串对象,那为什么其它自定义对象只能打印出地址信息什么的,而数据类型的对象可以直接打印?我猜是PY能识别出数据类型的对象吧,当让他打印他不认识的对象时,它就给你打印个地址。
不过我不确定我的理解是否正确哈,中间两个月复习考试去了,没学,现在还在补教学视频……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 14:06:34 | 显示全部楼层
这道题太难了 发表于 2022-1-2 13:31
我的理解是:各种数据类型(int、string、bool等)均属于一个个类,我们在打印字符串型数据的时候,其实 ...

你的理解是不是 说是在这个str的new方法里头可能有些特别的东西 因为str的new也是要返回object的new 也应该是一个地址,但是这里被py识别出这是在str类里 最终改变了它返回的东西成了字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-2 15:15:28 | 显示全部楼层
2392688470 发表于 2022-1-2 14:06
你的理解是不是 说是在这个str的new方法里头可能有些特别的东西 因为str的new也是要返回object的new 也应 ...

差不多是这意思。
不过我的意思也没想的那么复杂,就是PY能识别str类,然后碰到要打印str类的对象时就直接把内容打印出来了。
自定义的新类如果继承了str类的所有属性和方法,那么新类就=str类了,自然也能直接打印出来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 16:11:55 | 显示全部楼层
这道题太难了 发表于 2022-1-2 15:15
差不多是这意思。
不过我的意思也没想的那么复杂,就是PY能识别str类,然后碰到要打印str类的对象时就直 ...

嗯嗯 明白了 谢谢老哥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 17:12:03 | 显示全部楼层
瞎搞,乱猜。  基本不会用到__new__,一旦介绍__new__方法,就必须讲清楚 它跟__init__的关系,
而要讲清楚它们的关系,你最好要先理解了 对象、实例和类 等抽象概念的含义,不然一时半会根本说不清楚。
你自己在站里搜一下之前别人的问题吧,是关于 __new__ 和 __init__ 的,就看你自己能不能理解了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 18:20:26 | 显示全部楼层
阿奇_o 发表于 2022-1-2 17:12
瞎搞,乱猜。  基本不会用到__new__,一旦介绍__new__方法,就必须讲清楚 它跟__init__的关系,
而要讲清 ...

我是这么理解的 这里返回 str.__new__(cls,string)也就是实例化的时候调用了str 所以打印的时候会出现数值.如果不对望指正
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-11 21:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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