Python基本特殊方法之__new__
2024-09-04 14:02:11
__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)
最新文章
- ASP.NET Web API 2基于令牌的身份验证
- IE文档版本和文档流模式
- PHP 调试
- QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)
- SOS.dll (SOS Debugging Extension)
- Java基础知识强化之IO流笔记36:InputStreamReader/OutputStreamWriter 复制文本文件案例
- RHEL7单独安装图形X11
- 模拟键盘发送文字(使用SendInput函数)
- 使用Boost.Asio编写通信程序
- js常用函数大全107个
- 转:loadrunner关联及web_reg_save_param方法浅析
- springcloud(八):配置中心服务化和高可用
- poj_2104: K-th Number 【主席树】
- LayUI之table数据表格获取行、行高亮等相关操作
- PHP单元测试使用
- 20175126《Java程序设计》第八周学习总结
- Android图片的Base64编码与解码
- Axis2的简单配置(完整版)
- 前端面试(原生js篇) - DOM
- [LOJ6436][PKUSC2018]神仙的游戏
热门文章
- 新建Maven项目时出错:org.apache.maven.archiver.MavenArchiver.getManifest
- 关于git bash的问题,pull不下来(登录之后,git帮你记住了,想切换其他用户)
- jQuery焦点图插件
- 关于 Content-Type:application/x-www-form-urlencoded 和 Content-Type:multipart/related(转)
- MVC viewbag &; viewdata
- java+opencv+intellij idea实现人脸识别
- Nginx配置端口访问的网站
- PhpStorm怎么用,PhpStorm常用快捷键教程
- SPOJ - VLATTICE
- 解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG