【问题标题】:Subclassing int class in Python在 Python 中继承 int 类
【发布时间】:2018-11-05 15:44:01
【问题描述】:

每次我在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 字面量都可以使用,而不必在操作之前对其进行类型转换?

【问题讨论】:

标签: python-3.x built-in subclassing


【解决方案1】:

抱歉,如果不构建您自己的自定义解释器,这是不可能的。字面量对象不是通过调用__builtins__ 中的构造函数来构造的,它们是使用直接调用内置类型的操作码构造的。

在编译代码时也会构造不可变的文字,所以无论如何你都来不及了。如果你反汇编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_ONLY_AST 标志)然后遍历解析树并将 int 文字替换为调用您自己的类型(使用ast.NodeTransformer)。然后你所要做的就是完成编译(再次使用compile())。你甚至可以使用导入钩子来做到这一点,这样它会在你的模块被导入时自动发生,但它会很混乱。

【讨论】:

    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2015-09-04
    相关资源
    最近更新 更多