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
时间: 2024-10-16 19:38:16