覆盖使用的类

问题描述:

假设有使用一些其他类LesserClass在一个地方一类NiceClass我不能编辑覆盖使用的类

# NiceClass.py 

class LesserClass: 
    ... 
    # stuff 
    ... 

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

现在我想用我自己的类MyLesserClass,而不是到处LesserClass在的NiceClass

# 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非覆盖的方法继承的版本将使用LesserClass从旧NiceClass.py

如果我只是将NiceClass的整个定义复制粘贴到MyNiceClass.py中,那么所有内容都可以正常工作。

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

+1

你的问题,目前尚不得而知。请尽量提供更多清晰度。你的期望和问题是什么? –

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

现在如果你想里面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