鱼C论坛

 找回密码
 立即注册
查看: 1352|回复: 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都是不可变类型
# 把输入字符串都变成大写字母
class CapStr(str):
        def __new__(cls,string):
                string = string.upper()
                return str.__new__(cls,string)
str1=CapStr("I Love FishC")
print(str1)
这里str1是一个CapStr类的对象,传递进去的参数 string 是"I Love FishC"
最后一句print得到的是"I LOVE FISHC"
这就是这个方法__new__的功能,传递进去的是一个不可变类型的参数,但是又需要对其进行改变

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

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

其实这些不可变类型都有自己的__new__函数
例如:
int(2.3)# 传递进去的是float 2.3,得到的是 int 2
int('5')# 传递进去的是str '5',得到的是 int 5
str([1,2,3])# 传递进去的是list [1,2,3],得到的是 str '[1,2,3]'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-28 15:47:35 | 显示全部楼层
你就简单理解成这个类的实例就是__new__的返回值就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int、float、str都是不可变类型
# 把输入字符串都变成大写字母
class CapStr(str):
        def __new__(cls,string):
                string = string.upper()
                return str.__new__(cls,string)
str1=CapStr("I Love FishC")
print(str1)
这里str1是一个CapStr类的对象,传递进去的参数 string 是"I Love FishC"
最后一句print得到的是"I LOVE FISHC"
这就是这个方法__new__的功能,传递进去的是一个不可变类型的参数,但是又需要对其进行改变

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

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

其实这些不可变类型都有自己的__new__函数
例如:
int(2.3)# 传递进去的是float 2.3,得到的是 int 2
int('5')# 传递进去的是str '5',得到的是 int 5
str([1,2,3])# 传递进去的是list [1,2,3],得到的是 str '[1,2,3]'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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