我想用定制的替换(扩展)隐式扩展int、float、str、list、dict、set和module类。
当我说“隐式”时,我的意思是当我声明“a=1”时,会生成Custom\ Int类型的对象(作为示例),而不是普通的整数对象。你知道吗
现在,我理解并尊重不这样做的理由。首先-搞乱内置就像搞乱物理定律一样。它不会带来任何好处。也就是说-我明白我所做的事情的严重性,如果我做错了会发生什么。你知道吗
第二,我知道修改基本情况不仅会影响当前的运行时,还会影响所有正在运行的python进程。我觉得通过重写这些基类的uuu new_uuu方法,使得它返回自定义的u Object,无论当且仅当某些环境因素为真时,其他运行时基本上不会受到影响。你知道吗
那么,回到手头的问题-我如何重写这些不同类型的新方法?你知道吗
Python禁止水果包装似乎是有希望的。不过,我还没有机会对它进行仔细的调查,如果有人能理解它,并总结出它的作用,那将节省我很多时间。你知道吗
除此之外,我还观察到一些奇怪的现象。你知道吗
对于monkeypatching的每一个答案,如果最终没有回到forbiddenfruit或者forbiddenfruit是如何工作的,都与修改我将称之为类的“绝对字典”有关。因为Python中的所有内容本质上都是函数/值到名称的映射(或字典),如果在正确的映射中更改名称new,则会更改对象的性质。你知道吗
问题是-我几乎取得的每一次成功都表明,如果我调用str('a').\uu new\uuuuuuuz(*args)'),它工作得很好{在某些情况下},但是调用varOne='a'似乎实际上并没有调用str.\uu new\uuuuz()。你知道吗
我猜,这与python在启动前解析程序有关,或者与在启动期间/启动后缓存各种类有关。或者我完全偏离了目标。python在启动之前预先读取并应用一些regex到它的模块中,或者机器代码,当它试图隐式地创建一个对象时,它会到达位于模块对象.内置[\uu类名\uuuu]
有什么想法吗?你知道吗
如果您想这样做,最好的选择可能是修改CPython源代码,并使用实际内置类型中的扩展构建自己的自定义Python构建。结果将更好地集成所有您还不了解的低级机制,并且您将在这个过程中学到很多。你知道吗
现在,你被很多因素阻碍了。这些是我想到的。你知道吗
首先,大多数创建内置对象的方法根本不经过} 或^{} 。这些调用通过硬连线来使用实际的内置类型,为真正的内置类型分配内存大小,通过静态分配的C结构的地址获取类型对象,诸如此类。如果不构建自己的定制Python,基本上不可能改变这些。你知道吗
__new__
方法。它们通过C级调用,比如^{第二个因素是,与
__new__
打交道甚至不足以正确地影响理论上应该经历__new__
的事情,比如int("5")
。Python有理由阻止您在内置类上设置属性,其中两个原因是插槽和类型属性缓存。你知道吗Slots是C API的公共部分,如果您尝试修改CPython源代码,您可能会了解到它。它们是C结构中的函数指针,在C级构成类型对象,其中大多数对应于Python级的魔术方法。例如,
__new__
方法有一个对应的tp_new
槽。大多数C代码访问插槽而不是方法,并且有一些代码可以确保插槽和方法是同步的,但是如果您绕过Python的保护,那么就会中断,一切都会变得一团糟。你知道吗type attribute cache甚至在C级也不是任何东西的公共部分。它是一个缓存,用于保存类型对象属性查找的结果,以使Python运行得更快。它的内存安全依赖于经过
type.__setattr__
的所有类型对象属性修改(以及所有内置类型对象属性修改被type.__setattr__
拒绝),但是如果您绕过保护,内存安全就会消失,并可能出现任意奇怪的结果。你知道吗第三个因素是有一堆不可变对象的缓存。小的int缓存,内部字符串dict,常量保存在字节码对象中,编译时常量折叠。。。有很多。对象不会在您期望的时候创建。(还有一些东西,比如说,
zip
保存最后一个输出元组,如果它看到您没有保留引用,就重用它,因为更多的方法是对象创建会打乱您的假设。)还有更多。比如,如果你试图用
int.__new__
来计算表达式5
,你会用什么参数?像所有底层代码这样的东西,它们确切地知道如何处理它所期望的类型,如果它得到一个MyCustomTuple
与实际元组具有完全不同的内存布局,就会非常混乱。使用内置软件有很多问题。你知道吗顺便说一句,你期望成为问题的一件事基本上不是问题。使用一个Python进程的内置不会影响其他Python进程的内置。。。除非那些其他进程是通过分叉第一个进程创建的,比如分叉模式下的
multiprocessing
。你知道吗相关问题 更多 >
编程相关推荐