鱼C论坛

 找回密码
 立即注册
查看: 1613|回复: 2

[已解决]python魔法方法

[复制链接]
发表于 2020-8-28 15:38:18 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼python书里161页讲的那个__new__(cls[,...])
听了三遍实在听不懂啊

甲鱼哥说__new__()只有在继承一个不可变类型,又需要进行修改的时候它的特性才显得尤为重要,这句话无法理解,意思是说例子里的str和float是不可变类型吗?那修改又是啥意思?实在不知道这个__new__()有啥用,求大神结合下面两个例子教教我

书里的例子
# 把输入字符串都变成大写字母
class CapStr(str):
        def __new__(cls,string):
                string = string.upper()
                return str.__new__(cls,string)

# 测试题1. 按照以下要求,定义一个类实现摄氏度到华氏度的转换(转换公式:华氏度 = 摄氏度*1.8+32)
class C2F(float):
        "摄氏度转换为华氏度"
        def __new__(cls, arg=0.0):
                return float.__new__(cls, arg * 1.8 + 32)
最佳答案
2020-8-28 16:45:09
本帖最后由 sunrise085 于 2020-8-28 16:53 编辑

int、float、str都是不可变类型
  1. # 把输入字符串都变成大写字母
  2. class CapStr(str):
  3.         def __new__(cls,string):
  4.                 string = string.upper()
  5.                 return str.__new__(cls,string)
  6. str1=CapStr("I Love FishC")
  7. print(str1)
复制代码

这里str1是一个CapStr类的对象,传递进去的参数 string 是"I Love FishC"
最后一句print得到的是"I LOVE FISHC"
这就是这个方法__new__的功能,传递进去的是一个不可变类型的参数,但是又需要对其进行改变

再来个例子
  1. # 测试题1. 按照以下要求,定义一个类实现摄氏度到华氏度的转换(转换公式:华氏度 = 摄氏度*1.8+32)
  2. class C2F(float):
  3.     "摄氏度转换为华氏度"
  4.     def __new__(cls, arg=0.0):
  5.         return float.__new__(cls, arg * 1.8 + 32)

  6. tem=C2F(20.5)
  7. print(tem)
复制代码

这里tem是一个C2F类的对象,传递进去的参数 arg是 20.5
最后一句print得到的是 68.9

其实这些不可变类型都有自己的__new__函数
例如:
  1. int(2.3)# 传递进去的是float 2.3,得到的是 int 2
  2. int('5')# 传递进去的是str '5',得到的是 int 5
  3. str([1,2,3])# 传递进去的是list [1,2,3],得到的是 str '[1,2,3]'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 15:47:35 | 显示全部楼层
你就简单理解成这个类的实例就是__new__的返回值就行了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-28 16:45:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-8-28 16:53 编辑

int、float、str都是不可变类型
  1. # 把输入字符串都变成大写字母
  2. class CapStr(str):
  3.         def __new__(cls,string):
  4.                 string = string.upper()
  5.                 return str.__new__(cls,string)
  6. str1=CapStr("I Love FishC")
  7. print(str1)
复制代码

这里str1是一个CapStr类的对象,传递进去的参数 string 是"I Love FishC"
最后一句print得到的是"I LOVE FISHC"
这就是这个方法__new__的功能,传递进去的是一个不可变类型的参数,但是又需要对其进行改变

再来个例子
  1. # 测试题1. 按照以下要求,定义一个类实现摄氏度到华氏度的转换(转换公式:华氏度 = 摄氏度*1.8+32)
  2. class C2F(float):
  3.     "摄氏度转换为华氏度"
  4.     def __new__(cls, arg=0.0):
  5.         return float.__new__(cls, arg * 1.8 + 32)

  6. tem=C2F(20.5)
  7. print(tem)
复制代码

这里tem是一个C2F类的对象,传递进去的参数 arg是 20.5
最后一句print得到的是 68.9

其实这些不可变类型都有自己的__new__函数
例如:
  1. int(2.3)# 传递进去的是float 2.3,得到的是 int 2
  2. int('5')# 传递进去的是str '5',得到的是 int 5
  3. str([1,2,3])# 传递进去的是list [1,2,3],得到的是 str '[1,2,3]'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 07:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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