关于书本上__new__魔法方法问题求助
本帖最后由 这道题太难了 于 2021-9-2 17:48 编辑原文中代码如下:
class CapStr(str):#申明一个名字叫CapStr的类,继承str类的所有属性和方法。
def __new__(cls, string):
string = string.upper()
return str.__new__(cls, string)
a = CapStr("I love fishC.com")
print("使用__new__方法获得的类的对象的值为:%s,数据类型为:" % a, type(a))
我自己又另外写了一个函数:
def CapStr(string):
string = string.upper()
return string
s = CapStr("I love fishC.com")
print("使用函数方法获得的类的对象的值为:%s,数据类型为:" % s, type(s))
运行结果如下:
使用__new__方法获得的类的对象的值为:I LOVE FISHC.COM,数据类型为: <class '__main__.CapStr'>
使用函数方法获得的类的对象的值为:I LOVE FISHC.COM,数据类型为: <class 'str'>
综上所属,我有了一些自己的理解:各种数据类型(int、string、bool等)均属于一个个类,我们在创建类的时候特别是继承类的时候相当于创建了一个新的数据类型,不同之处在于我们自己创建的数据类型可以在父类的基础上进行修改。
在实际代码编写过程中调用方法都一样,都是通过a = CapStr("I love fishC.com")的方式来获取所需要的数据,只不过实现方式不一样:
使用__new__方法是在创建对象a时就直接得到了想要的值,使用函数方法则是让原对象通过运算得到。
所以我猜测,当需要大量获取此类值时,使用__new__方法比使用函数重复运算的方法效率要高。但如果数据量不大时,尤其对于新手而言,其实使用函数就够了也更不容易出错?不知道这么理解对不对?会不会存在一种只能使用__new__方法不能使用函数的情况?
我理解是这两个都一样如果只是为了改大写字母,只不过定义类的话可以接着改写更多其他属性和方法。
新手,留给其他大佬评论 你好不知道你的问题解决没有 我也很疑惑,这里返回的是一个CapStr的类对象,但是打印的却是I LOVE FISHC.COM这样一个值,正常打印一个类对象的话不是应该都是一个对象的信息和地址吗 2392688470 发表于 2022-1-2 11:54
你好不知道你的问题解决没有 我也很疑惑,这里返回的是一个CapStr的类对象,但是打印的却是I LOVE FISHC.CO ...
我的理解是:各种数据类型(int、string、bool等)均属于一个个类,我们在打印字符串型数据的时候,其实也就是打印字符串对象,那为什么其它自定义对象只能打印出地址信息什么的,而数据类型的对象可以直接打印?我猜是PY能识别出数据类型的对象吧,当让他打印他不认识的对象时,它就给你打印个地址。
不过我不确定我的理解是否正确哈,中间两个月复习考试去了,没学,现在还在补教学视频…… 这道题太难了 发表于 2022-1-2 13:31
我的理解是:各种数据类型(int、string、bool等)均属于一个个类,我们在打印字符串型数据的时候,其实 ...
你的理解是不是 说是在这个str的new方法里头可能有些特别的东西 因为str的new也是要返回object的new 也应该是一个地址,但是这里被py识别出这是在str类里 最终改变了它返回的东西成了字符串 2392688470 发表于 2022-1-2 14:06
你的理解是不是 说是在这个str的new方法里头可能有些特别的东西 因为str的new也是要返回object的new 也应 ...
差不多是这意思。
不过我的意思也没想的那么复杂,就是PY能识别str类,然后碰到要打印str类的对象时就直接把内容打印出来了。
自定义的新类如果继承了str类的所有属性和方法,那么新类就=str类了,自然也能直接打印出来了。 这道题太难了 发表于 2022-1-2 15:15
差不多是这意思。
不过我的意思也没想的那么复杂,就是PY能识别str类,然后碰到要打印str类的对象时就直 ...
嗯嗯 明白了 谢谢老哥 瞎搞,乱猜。基本不会用到__new__,一旦介绍__new__方法,就必须讲清楚 它跟__init__的关系,
而要讲清楚它们的关系,你最好要先理解了 对象、实例和类 等抽象概念的含义,不然一时半会根本说不清楚。
你自己在站里搜一下之前别人的问题吧,是关于 __new__ 和 __init__ 的,就看你自己能不能理解了。 阿奇_o 发表于 2022-1-2 17:12
瞎搞,乱猜。基本不会用到__new__,一旦介绍__new__方法,就必须讲清楚 它跟__init__的关系,
而要讲清 ...
我是这么理解的 这里返回 str.__new__(cls,string)也就是实例化的时候调用了str 所以打印的时候会出现数值.如果不对望指正
页:
[1]