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

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

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

Python基本特殊方法之__new__建议收藏此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

__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__建议收藏

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • OOXML,XLSX分析

    OOXML,XLSX分析07以上的xlsx是使用了OOXML和zip,将后缀修改为.zip,就可以看到文件,主要分析xl目录下的文件,如图:主要数据文件在xl目录下面styles.xml里面存放着excel的样式数据很

  • MyBatis面试题(2020最新版)

    MyBatis面试题(2020最新版)整理好的MyBatis面试题库,史上最全的MyBatis面试题,MyBatis面试宝典,特此分享给大家MyBatis介绍MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plai…

  • 7本免费的Java电子书和教程

    7本免费的Java电子书和教程本文由ImportNew-唐小娟翻译自Javapapers。欢迎加入翻译小组。转载请见文末要求。1.ThinkinginJava(ThirdEdition)本书的作者是BruceEckel,它一直都是Java最畅销的免费电子书。这本书可以帮助你系统的学习Java,里面包含有很多好的代码示例。第三版仍旧是免费的,直到第四版才开始收费,不过仍旧值得买一本收藏。Think…

  • 约瑟夫环 OJ

    约瑟夫环 OJ循环链表的应用,并且应为不带头节点的循环链表,首先创建一个循环链表,在函数JOHEPHUS中进行操作,主要就是用for找到要删除的元素(注意p==1单独考虑,for中p至少为2),删除元素并输出直至链表为空。for(j=1;j<=p-1;j++)把寻找报数的位置和寻找要删除的节点的前驱结合在一个循环中,减少时间复杂度,因为第一次写我是在主函数中用r指向找到的要删除的节点,然后传入de…

  • 解决无限 This file is indented with tabs instead of 4 spaces

    解决无限 This file is indented with tabs instead of 4 spaces

    2021年10月11日
  • docker搭建kafka集群

    docker搭建kafka集群docker搭建kafka集群我在M1mbp上使用的以下镜像新建文件zk-kafka-docker-compose.ymlversion:”2″services:zookeeper:user:rootimage:docker.io/zookeeperports:-“12181:2181″environment:-ALLOW_ANONYMOUS_LOGIN=yesvolumes:-zoo

发表回复

您的电子邮箱地址不会被公开。

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