(Python)Monkeypatch__new__用于Python中int、float、str、list、dict、s



我想用自定义的替换(扩展)隐式扩展int、float、str、list、dict、set和module类

当我说"隐式"时,我的意思是,当我声明"a=1"时,会生成Custom_Int类型的对象(例如),而不是普通的整数对象。

现在,我理解并尊重不这样做的理由。首先,破坏内置程序就像破坏物理定律。这不会带来任何好处。也就是说,我确实理解我试图做的事情的严重性,以及如果我做错了会发生什么。

第二,我知道修改基本情况不仅会影响当前运行时,还会影响所有正在运行的python进程。我认为,通过重写这些基类的__new__方法,使其返回Custom_Object_Whatever,如果且仅当某些环境因素为真,则其他运行时间将基本上不受影响。

那么,回到手头的问题上来——我如何覆盖这些不同类型的__new__方法?

蟒蛇禁用的水果包装似乎很有希望。不过,我还没有机会再次调查它,如果了解它的人能够总结它的作用,那将为我节省很多时间。

除此之外,我还观察到了一些奇怪的事情。

每一个最终没有回到forbiddenfuit或forbiddenpuit如何工作的猴痘测试答案都与修改我所说的类的"绝对字典"有关。因为Python中的所有内容本质上都是函数/值到名称的映射(或字典),所以如果在正确的映射中更改名称__new__,则会更改对象的性质。

问题是,如果我调用str('a'),我所取得的每一次近乎成功都是如此__new__(*args)'它运行良好{在某些情况下},但varOne='a'的调用似乎实际上并没有调用str.__new__()。

我的猜测是,这与python在启动前对程序的解析有关,或者与启动期间/启动后对各种类的缓存有关。或者我完全错了。python要么在启动前预先读取一些regex并将其应用于其模块,要么在机器代码中,当它试图隐式创建一个对象时,它会找到位于moduleObject.buildines[__classname__]中的类之外的其他对象

有什么想法吗?

如果您想做到这一点,您最好的选择可能是修改CPython源代码,并使用烘焙到实际内置类型中的扩展构建您自己的自定义Python构建。结果将更好地与你还不了解的所有底层机制集成,在这个过程中你会学到很多。


现在,你受到很多因素的阻碍。以下是我想到的。

首先,大多数创建内置对象的方法根本不需要使用__new__方法。它们执行类似PyLong_FromLongPyList_New的C级调用。这些调用是硬连接的,用于使用实际的内置类型,为实际内置类型分配大小的内存,通过静态分配的C结构的地址获取类型对象,等等。如果不构建自己的自定义Python,基本上不可能改变这些。

第二个因素是,扰乱__new__甚至不足以正确影响理论上应该经过__new__的东西,比如int("5")。Python有阻止您在内置类上设置属性的原因,其中两个原因是插槽类型属性缓存

插槽是C API的公共部分,如果您尝试修改CPython源代码,您可能会了解到这一点。它们是C结构中的函数指针,构成C级的类型对象,其中大多数对应于Python级的魔术方法。例如,__new__方法具有相应的tp_new时隙。大多数C代码访问槽而不是方法,并且有代码可以确保槽和方法同步,但如果绕过Python的保护,就会中断,一切都会变得一团糟。

即使在C级别,type属性缓存也不是任何东西的公共部分。它是一个缓存,用于保存类型对象属性查找的结果,以使Python运行得更快。它的内存安全依赖于所有类型对象属性修改都经过type.__setattr__(以及所有内置类型对象属性的修改都被type.__setattr__拒绝),但如果绕过保护,内存安全就会失效,可能会出现任意奇怪的结果。

第三个因素是有一堆不可变对象的缓存。小型int缓存、内部字符串dict、保存在字节码对象中的常量、编译时常量折叠。。。有很多。对象不会在您期望的时候创建。(还有一些东西,比如zip保存最后一个输出元组,如果它发现你没有保留引用,就重用它,因为对象创建会在更多方面干扰你的假设。)

还有更多。比如,如果您尝试使用int.__new__来计算表达式5int.__new__会采用什么参数?像所有底层代码一样,它确切地知道如何使用它所期望的类型,如果它得到一个与实际元组具有完全不同内存布局的MyCustomTuple,就会非常困惑。使用内置程序有很多问题。

顺便说一句,你期望成为问题的一件事大多不是问题。使用一个Python进程的内置程序不会影响其他Python进程的内嵌程序。。。除非那些其他进程是通过分叉第一个进程(例如在分叉模式下使用multiprocessing)来创建的。

最新更新