• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
风和月
博客园    首页    新随笔    联系   管理    订阅  订阅

不可变类型子类化与可变类型子类化

不可变类型子类化

假定我们需要处理大量的浮点数,将浮点数四舍五入后得到最后的结果。这时我们可以定义这样一个类,用来进行这个操作。例如:

1 class RoundFloat(float):
2 def __new__(cls, val):
3 return float.__new__(cls,round(val,1))
4 print(RoundFloat(2.6557))

结果为: 

  2.7    

在这个类里面,通过调用父类的构造器来创建对象,然后实例化float、RoundFloat。这里我们仅仅是从一种类型中派生而来,我们可以使用super()内建函数去捕获对应的父类,然后调用父类的__new__()方法进行实例化。例如:

1 class RoundFloat(float):
2 def __new__(cls, val):
3 return super(RoundFloat,cls).__new__(cls,round(val,1))
4 print(RoundFloat(2.6557))

结果为:

  2.7  

可变类型子类化

子类化一个可变类型与子类化不可变类型很类似,但是我们可能不需要使用__new__()或者是__init__(),因为一般情况下我们定义的类所继承到的类型的默认行为就足够我们用了。例如:

1 class SortedKeyDict(dict):
2 def keys(self):
3 return sorted(super( SortedKeyDict, self).keys())
4 d = SortedKeyDict((('zhangsan', 1), ('lisi', 2),('wangwu', 3)))
5 print("By iterator:".ljust(12), [key for key in d])
6 print("By keys():".ljust(12), d.keys())

 

结果为:

1 By iterator: ['zhangsan', 'lisi', 'wangwu']
2 By keys(): ['lisi', 'wangwu', 'zhangsan']

 

posted @ 2020-04-11 22:31  风和月  阅读(417)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3