__new__()和不可变对象

  __new__方法的一个用途是初始化不可变对象,__new()__方法中允许创建未初始化的对象,这允许我们在__init__()方法被调用之前先设置对象的属性

  例:为float对象定义一个包含单位信息的属性

  (1)重载__init__()方法

#coding = utf-8

class myfloat(float):
def __init__(self, value, unit):
self.value = value
self.unit = unit if __name__ == "__main__":
f = myfloat(3, "hello")

说明对于内置的float类不能简单的重载__init__()方法,对于其他的内置不可变类型也是同样的问题,我们不能在不可变对象self上设置新的属性值

  (2)重载__new__()方法

#coding = utf-8

class myfloat(float):
def __new__(cls, value, unit):
obj = super().__new__(cls, value)
#obj.unit = unit
return obj def __init__(self, value, unit):
self.value = value
self.unit = unit if __name__ == "__main__":
f = myfloat(3, "kg")
print (f.value, f.unit)
print (f, f.unit)

__new__()和元类型

  例:实现有序属性

#coding=utf-8

class myclass(type):
@classmethod
def __prepare__(mcs, name, bases, **kwargs):
return super().__prepare__(name,bases,**kwargs) def __new__(cls, name, bases, namespace, **kwargs):
print ("name:",name)
print ("bases:",bases)
print ("namespace:",namespace)
a = super().__new__(cls, name, bases, namespace)
a._order = tuple(c for c in namespace if not c.startswith("__"))
print (a)
print (type(a))
return a
def __init__(self, name, bases,namespace, **kwargs):
super().__init__(name, bases, namespace) class people(metaclass=myclass):
name = "zhanglin"
age = "" def sayhello(self):
self.color="red"
print ("say hello") if __name__ == "__main__":
p = people()
print (p._order)

最新文章

  1. ASP.NET Web API 2基于令牌的身份验证
  2. IE文档版本和文档流模式
  3. PHP 调试
  4. QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
  5. SOS.dll (SOS Debugging Extension)
  6. Java基础知识强化之IO流笔记36:InputStreamReader/OutputStreamWriter 复制文本文件案例
  7. RHEL7单独安装图形X11
  8. 模拟键盘发送文字(使用SendInput函数)
  9. 使用Boost.Asio编写通信程序
  10. js常用函数大全107个
  11. 转:loadrunner关联及web_reg_save_param方法浅析
  12. springcloud(八):配置中心服务化和高可用
  13. poj_2104: K-th Number 【主席树】
  14. LayUI之table数据表格获取行、行高亮等相关操作
  15. PHP单元测试使用
  16. 20175126《Java程序设计》第八周学习总结
  17. Android图片的Base64编码与解码
  18. Axis2的简单配置(完整版)
  19. 前端面试(原生js篇) - DOM
  20. [LOJ6436][PKUSC2018]神仙的游戏

热门文章

  1. 新建Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifest
  2. 关于git bash的问题,pull不下来(登录之后,git帮你记住了,想切换其他用户)
  3. jQuery焦点图插件
  4. 关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)
  5. MVC viewbag & viewdata
  6. java+opencv+intellij idea实现人脸识别
  7. Nginx配置端口访问的网站
  8. PhpStorm怎么用,PhpStorm常用快捷键教程
  9. SPOJ - VLATTICE
  10. 解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG