首页 > 其他 > 详细

__init__和__new__

时间:2017-11-09 23:45:24      阅读:221      评论:0      收藏:0      [点我收藏+]

1 __init__和__new__的区别

  1 当创建一个实例的时候会首先调用__new__, 然后在初始化实例的时候会调用__init__.

  2 __new__是类级别的方法,__init__是个实例方法.

  3 __new__方法会返回一个创建的实例,而__init__不需要有返回值

 

2 __new__ 实际应用

2.1 在元类中的应用

# 由type创建元类,必须要继承type
class MetaClassFoo(type):

    # 由元类创建类也遵循 名字;继承;方法
    def __new__(cls, name, base, attrs):
        # 天赋,赋予给通过该元类创建的类
        attrs[func] = lambda self: im %s and i have func! % self.name
        return type.__new__(cls, name, base, attrs)


# 由元类创建类
class Foo(object):

    __metaclass__ = MetaClassFoo

    def __init__(self):
        self.name = www


# 由类创建实例,并生成方法
print Foo().func()

2.2 在单例模型中的应用

class SingleObj(object):
    def __new__(cls):
        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
        if not hasattr(cls, instance):
            cls.instance = super(SingleObj, cls).__new__(cls)  # 使用__new__最好返回super()方法
        return cls


obj1 = SingleObj()
obj2 = SingleObj()

obj1.attr1 = value1
print obj1.attr1, obj2.attr1
print obj1 is obj2
# out:
value1 value1
True

 

__init__和__new__

原文:http://www.cnblogs.com/fuzzier/p/7811765.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!