|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
本帖最后由 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]'
复制代码
|
|