2016-07-01 68 views
0

我是Python的新手,我需要測試子類方法而無需初始化基類實例,因爲在基類中,網絡和其他組件有很多依賴關係,我的子類方法是 獨立。如何在不實例化Python中的基類的情況下測試子類方法?

我試圖通過從子類中刪除基類方法來創建一個新的子類,但它不能工作。這裏是代碼。

def remove_base(child_cls, base_cls): 
    allmembers = inspect.getmembers(child_cls, predicate=inspect.ismethod) 
    allmembers_dict = dict(allmembers) 
    hbasemembers = inspect.getmembers(base_cls, predicate=inspect.ismethod) 
    hbase_dict = dict(hbasemembers) 
    child_class_member = set(allmembers_dict.keys()) - set(hbase_dict.keys()) 
    new_dict = {} 
    for key in allmembers_dict.keys(): 
     for child_member in child_class_member: 
      if key == child_member: 
       new_dict[key] = allmembers_dict[key] 
    return new_dict 

class A: 
    def add(self, i): 
     print i + 1 

class B(A): 
    def sub(self, i): 
     print i - 1 

newB = type("newB", (object,), remove_base(B, A)) 
b = newB() 
b.sub(5) 

的錯誤信息是:

TypeError: unbound method sub() must be called with B instance as first argument (got int instance instead)

我想去除基類的方法可能是錯誤的方式。 如何處理這個問題?

+0

覆蓋父方法,而無需調用'super'所以纔有了孩子實施wouild被稱爲 – Cyrbil

+1

,這是錯誤的東西是你的繼承結構。如果你的子方法完全獨立於父類,那麼你根本不應該繼承。 –

+1

你能舉一個不太抽象的例子嗎?在你當前的例子中,顯而易見的答案是將這兩個方法'@ staticmethod'製作成它們,因爲它們根本不使用'self',然後測試'B.sub'沒有實例化任何東西。沒有上下文,這看起來像[XY問題](http://meta.stackexchange.com/q/66377/248731)。 – jonrsharpe

回答

0

可以使用__dict__B直接:

class A(object): 
    def add(self, i): 
     print(i + 1) 

class B(A): 
    def sub(self, i): 
     print(i - 1) 

newB = type("newB", (object,), dict(B.__dict__)) 
b = newB() 
b.sub(5) 
相關問題