__init__和__new__

Posted fuzzier

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了__init__和__new__相关的知识,希望对你有一定的参考价值。

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__的主要内容,如果未能解决你的问题,请参考以下文章

Python中的__init__和__new__

python中的__init__和__new__的区别

使用 __new__ 覆盖子类中的 __init__

__new__ 和 __init__ [重复]

__init__和__new__

__new__和__init__的区别