这是代码:
Class A: pass
Class B: pass
Class Example(A, B): pass
...a lot of method
# new class B called BPlus
Class BPlus: pass
# want a new class Example that base on (A, BPlus) but not copy old Example's method.
Class Example(A, BPlus)
...here do not copy method
# try change __base__ but got 'readonly attribute' error
Example.__base__ = (A, BPlus)
如何在不复制重复代码的情况下更改基类。
您的问题写得不正确,但它确实有一个简短的答案: 您可以更改 Python 定义的类的
__bases__
属性,只要旧的或新的基类都没有“不同的布局” - 这意味着它们在内置级别的定义没有不同的字段,并且它们没有使用__slots__
。
因此,使用您的命名,但实际上带有一个完美有效的片段:
class A:
...
class B:
...
class BPlus(B):
def test(self):
print(42)
...
class Example(A, B):
...
print(Example.__bases__)
# (A, B)
A.__bases__ = A, BPlus
print(Example.__bases__)
# (A, BPlus)
Example().test()
# 42