覆盖内部类

时间:2016-05-19 20:41:10

标签: python class python-3.x override

让我们举个例子

class A:
    class B:
        def f(self):
            return 1
    def a(self):
        return A.B().f()
    def b(self):
        return self.B().f()

class C(A):
    class B(A.B):
        def f(self):
            return 2

print(A().a())
print(A().b())
print(C().a())
print(C().b())

将产生

1
1
1
2

我想做点什么,它会产生

1
1
2
2

如何覆盖A类,以便两个方法a和b都返回2?
我正在使用antlr生成代码。我想要做的是,例如覆盖__str __()方法以获得某种更好的信息。它不断生成像MyLanguageParser.RootContext()而不是self.RootContext()的代码,现在,我想要覆盖我需要处理方法代码的任何东西,其中调用类。
你有解决方案吗?我知道我不是最好的Python。
也许这是不可能的,解决方案是改变生成的代码,但我听到的是非常糟糕的主意。
编辑:
产生A类并且是不可变的 我所想的是像

A.B = C.B
print(A().a())
print(A().b())
print(C().a())
print(C().b())

将生成

2
2
2
2

我不知道这是否合法。实际上我不会使用A类,但其余生成的代码可以使用它。我不知道它是否安全。 编辑2:缺少自我纠正错误

1 个答案:

答案 0 :(得分:1)

可能:

class A:
    class B:
        def f(self):
            return 1
    def a(self):
        # `type(self)` here instead of `A`
        # to get actual `C` class instead of `A`
        # when `a()` calls for `C()`
        return type(self).B().f()
    def b(self):
        return self.B().f()

class C(A):
    class B(A.B):
        def f(self):
            return 2

,无需修改A

class A:
    class B:
        def f(self):
            return 1
    def a(self):
        return A.B().f()
    def b(self):
        return self.B().f()


class C(A):
    class B(A.B):
        def f(self):
            return 2

    def a(self):  # reimplement
        return type(self).B().f()

以某种方式尝试动态重写A以避免重写a代码:

class A:
    class B:
        def f(self):
            return 1
    def a(self):
        return A.B().f()
    def b(self):
        return self.B().f()


class C(A):
    class B(A.B):
        def f(self):
            return 2

    def a(self):
        tmp, globals()['A'] = A, type(self)
        try:
            return super().a()
        finally:
            globals()['A'] = tmp

注意,这可能是个坏主意。我想如果有更好的方法。