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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

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

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