让我们举个例子
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:缺少自我纠正错误
答案 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
注意,这可能是个坏主意。我想如果有更好的方法。