【问题标题】:Override used classes in parent class覆盖父类中使用的类
【发布时间】:2025-12-20 11:00:06
【问题描述】:

假设有一个类 NiceClass 在我无法编辑的地方使用其他类 LesserClass

# NiceClass.py

class LesserClass:
    ...
    # stuff
    ...

class NiceClass:
    ...
    # Lots of use of lesser class in here...
    ...

现在我想在NiceClass的继承版本中到处使用我自己的类MyLesserClass而不是LesserClass

# MyNiceClass.py

from NiceClass import NiceClass
from NiceClass import LesserClass as oldLesserClass

class LesserClass(oldLesserClass):
    ...
    # Some extra stuff
    ...

class MyNiceClass(NiceClass):
    ...
    # Everywhere LesserClass was used I now want to use MyLesserClass
    ...

MyNiceClass 中的所有非覆盖方法都将使用旧NiceClass.py 中的LesserClass

如果我只是将NiceClass 的整个定义复制粘贴到MyNiceClass.py 中,一切都会按我的意愿工作。

这就像我只想继承源代码而不是整个命名空间。也许继承是错误的方式?

【问题讨论】:

  • 你的问题还不清楚。请尝试提供更多的清晰度。您的期望和问题是什么?

标签: python python-3.x oop inheritance namespaces


【解决方案1】:

我希望这仅限于使用LesserClass类的NiceClass下的方法。

现在,如果您希望MyNiceClass 中的方法使用MyLesserClass 而不是LesserClass,那么您可以更新这些方法的__globals__ 字典并将名称'LesserClass' 指向MyLesserClass

这是一个通过覆盖__getattribute__ 来演示相同的简单示例:

class A:
    a = 'A.a'
    b = 'A.b'


class B:
    def func_a(self):
        print(A.a)

    def func_b(self):
        print(A.b)


class C:
    a = 'C.a'
    b = 'C.b'


class D(B):
    def func_a(self):
        print(C.a)

    def __getattribute__(self, attr):
        value = object.__getattribute__(self, attr)
        if callable(value):
            value = update_namespace(value, {'old': {'name': 'A', 'obj': A}, 'new': {'obj': C}})
        return value


def update_namespace(func, namespace):
    def wrapper(*args, **kwargs):
        # Update the globals
        func.__globals__[namespace['old']['name']] = namespace['new']['obj']
        val = func(*args, **kwargs)
        # Restore it back to the actual value
        func.__globals__[namespace['old']['name']] = namespace['old']['obj']
        return val
    return wrapper


d = D()
d.func_a()  # This should print C.a
d.func_b()  # This should print C.b

输出:

C.a
C.b

【讨论】: