0%

forbiddenfruit修改ndarray

请注意:在本文中包含了一些非常危险的行为,在使用前请务必三思

事情起因

因为之前我做过一个处理误差的库的尝试,虽然构造了一个可以自动计算常见误差形式的类,然而这样一个类用在科学计算上的价值却不大,原因就在于这么做没法使用python中的常用数学计算库numpy,那么我就开始动起了歪脑筋:是不是可以通过修改np.ndarray一些函数支持来实现我所想要的功能

就以__add__为例,我可以创建一个新函数去替代__add__以实现我的功能.

于是尝试了一下np.ndarray.__add__=myadd,很不幸,解释器告诉我

1
TypeError: can't set attributes of built-in/extension type 'numpy.ndarray'

我考虑了一下,发现原因是numpy不是由python编写的,因此也无法直接使用python修改动态类型的手段.

解决:forbiddenfruit

正在我表示绝望准备放弃的时候(原本准备用类继承实现功能),突然看到了一篇文章

在这篇文章,作者介绍了一个神奇又危险的库forbiddenfruit(下载地址),在这个库里,你可以替换python内置的类型

在文章中也介绍了修改内置类的工作原理,但是仍然无法解决运算符重载的问题

__add__可以正常被替换,但是+就不行了

那么下面我可以来演示一下如何替换掉python中list的加法方法

1
2
3
4
5
6
7
from forbiddenfruit import curse
def change_list_add():
old_add=list.__add__#保存原来加法实现
def new_add(self,o):
return old_add(old_add(self,[" "]),o)#新的加法
curse(list,"__add__",new_add)#替换掉原有加法
change_list_add()

然后未来进行列表加法时大家就会惊奇地发现列表两个元素之间总是会有一个空格

在实际的生产中,这样的做法可能会导致暴力事件的发生

大家也可以试试在python大作业中用这个东西(吃C别怪我)