Python基本特殊方法之__new__建议收藏

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

__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")

Python基本特殊方法之__new__建议收藏

说明对于内置的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)

Python基本特殊方法之__new__建议收藏

__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 = "31"

    def sayhello(self):
        self.color="red"
        print ("say hello")

if __name__ == "__main__":
    p = people()
    print (p._order)

Python基本特殊方法之__new__建议收藏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120191.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis防止缓存击穿

    redis缓存雪崩 缓存穿透 缓存击穿如何解决_redis防止缓存击穿文章目录缓存穿透缓存击穿缓存雪崩缓存穿透数据库中没有这个数据,内存中也没有这个数据简单场景public class demoController { public R selectOrderById(int id){ Object redisObj = ValueOperations.get(Strubg.valueof(id)); if(redisObj != null){ return new R().setCode(200).

    2022年8月8日
    5
  • ioctl函数_通过ioctl函数设置IP不允许修改

    ioctl函数_通过ioctl函数设置IP不允许修改一、什么是ioctl  ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。  ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl函数来控制设备的I/O通道。  用户程序所作的只是通过命令码(cmd)告诉驱动程序它想…

    2022年10月18日
    4
  • lnk2001 lnk1120_lnk1120

    lnk2001 lnk1120_lnk1120LNK2001..转自百度百科学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。  初学者在学习VC++的过程中,遇到的LNK20

    2022年10月5日
    4
  • 自己定义的路由事件

    自己定义的路由事件

    2022年1月10日
    38
  • C#区分中英文统计字符串的长度

    C#区分中英文统计字符串的长度

    2021年8月5日
    55
  • 【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议保存)

    【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议保存)本文所有命令,博主均全部操作验证过,保证准确性;非复制粘贴拼凑文章;如果想了解更多工具命令,可在评论区留下评论,博主会择期加上;kafka-topics.sh、kafka-configs.sh、kafka-reassign-partitionskafka-console-producer.sh、kafka-console-consumer.sh、kafka-leader-election、kafka-verifiable-producer.sh、kafka-verifiable-consumer、

    2022年7月18日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号