Python 3.x Python中int类的子类化
每次在我的Python 3.x Python中int类的子类化,python-3.x,built-in,subclassing,Python 3.x,Built In,Subclassing,每次在我的TestClass中添加两个整数时,我都想做一些事情 import builtins class myInt(int): def __add__(self, other): print("Do something") class TestClass: def __init__(self): builtins.int = myInt def testMethod(self): a = 1 b =
TestClass
中添加两个整数时,我都想做一些事情
import builtins
class myInt(int):
def __add__(self, other):
print("Do something")
class TestClass:
def __init__(self):
builtins.int = myInt
def testMethod(self):
a = 1
b = 2
c = a + b
当我调用我的testMethod
时,什么都不会发生,但是如果我这样定义它,我会得到想要的效果:
def testMethod(self):
a = int(1)
b = 2
c = a + b
是否可以对所有int文本执行此操作,而不必在操作之前对其进行类型转换?抱歉,如果不构建自己的自定义解释器,这是不可能的。文本对象不是通过调用
\uuuuu内置类型中的构造函数来构造的,它们是使用直接调用内置类型的操作码来构造的
此外,编译代码时会构造不可变的文本,因此无论如何,您都太迟了。如果您反汇编testMethod
,您将看到它只使用编译的常量,而不尝试构造它们:
>>> dis.dis(TestClass.testMethod)
5 0 LOAD_CONST 1 (1)
2 STORE_FAST 1 (a)
6 4 LOAD_CONST 2 (2)
6 STORE_FAST 2 (b)
7 8 LOAD_FAST 1 (a)
10 LOAD_FAST 2 (b)
12 BINARY_ADD
14 STORE_FAST 3 (c)
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
可变文字是在运行时构造的,但它们使用操作码来构造适当的值,而不是调用类型:
>>> dis.dis(lambda: {'a': 1, 'b': 2})
1 0 LOAD_CONST 1 (1)
2 LOAD_CONST 2 (2)
4 LOAD_CONST 3 (('a', 'b'))
6 BUILD_CONST_KEY_MAP 2
8 RETURN_VALUE
通过解析源代码(使用内置的compile()
和ast.PyCF\u ONLY\u ast
标志),然后遍历解析树并用对自己类型的调用替换int
文本(使用ast.NodeTransformer
)。然后,您只需完成编译(再次使用compile()
)。您甚至可以使用导入挂钩来实现这一点,以便在导入模块时自动执行,但这会很混乱。简短回答:不。这里有很多关于这一点的讨论: