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()
)。您甚至可以使用导入挂钩来实现这一点,以便在导入模块时自动执行,但这会很混乱。

简短回答:不。这里有很多关于这一点的讨论: