2017-08-14 66 views
4

假設有使用一些其他類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

你的問題,目前尚不得而知。請儘量提供更多清晰度。你的期望和問題是什麼? –

回答

2

我希望這僅限於使用類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