python中new函数 python __new__原理( 三 )


i = PositiveInteger(-3)
print i
1
2
3
4
5
6
class PositiveInteger(int):
【python中new函数 python __new__原理】def __new__(cls, value):
return super(PositiveInteger, cls).__new__(cls, abs(value))
i = PositiveInteger(-3)
print i
通过重载__new__方法,我们实现了需要的功能 。
另外一个作用,关于自定义metaclass 。其实我最早接触__new__的时候,就是因为需要自定义 metaclass,但鉴于篇幅原因 , 我们下次再来讲python中的metaclass和__new__的关系 。
四、用__new__来实现单例
事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton)。
因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式 。
class Singleton(object):
def __new__(cls):
# 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2
1
2
3
4
5
6
7
8
9
10
11
12
13
class Singleton(object):
def __new__(cls):
# 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance
obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2
输出结果:
value1 value1
True
1
2
value1 value1
True
可以看到obj1和obj2是同一个实例 。
Python之内建方法 new 与 init 创建类对象的过程中python中new函数,首先调用new方法生成对象实例python中new函数,然后自动(隐式)回调init方法 。
init方法在实例化后执行,控制私有地址空间的值的初始化过程 。
new方法在实例化前执行,控制类实例化的过程 。有些属性在类实例化后将不可更改,只能在实例化过程去改变 。不仅仅是操控属性,甚至改变输出,返回任意类实例 。
场景
如果子类继承了int、str、tuple这类不可变类型 , 可以通过new方法改变其属性
原理
不可变类型的特点是实例化后,属性无法被更改 。如 a = 10 ,执行new的阶段会在内存中开辟了一个地址块存放10这个值,之后无法再修改这个地址块的值 。因此自定义赋值逻辑应当在new方法中执行 。
实现
场景
随便举几个例子python中new函数:
实现
python中new函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python __new__原理、python中new函数的信息别忘了在本站进行查找喔 。

推荐阅读