2017-06-13 12 views
0

是否存在從父類檢查子類中方法的輸出的pythonic方法。例如,如果你有這個結構,我想在子類中的方法'generate'的輸出中執行一個檢查(在父類中)(例如,如果它有正確的形狀)。如何檢查子類中的方法的輸出是否具有正確的大小

class parent_class(object): 

    def generate(self): 
     raise NotImplementedError 

class child_class(parent_class): 

    def generate(self, array_size): 
     return np.random.uniform(size = [10,10]) 

下達到正確的效果,但需要調用子類的初始化方法方法check_class。有沒有辦法實現這種檢查,而不必記得在每個子類中調用「check_class」方法?

class parent_class(object): 

    def generate(self, size): 
     raise NotImplementedError 

    def check_class(self): 
     assert self.generate([5,5]).shape == (5,5), 'Output of generate has the wrong shape' 

class child_class(parent_class): 

    def __init__(self): 
     self.check_class() 

    def generate(self, size): 
     return np.random.uniform(size = [10,10]) 

如果你調用生成,這現在將檢查輸出的大小是正確的,因爲需要:

a = child_class() 

--------------------------------------------------------------------------- 
AssertionError       Traceback (most recent call last) 
<ipython-input-58-389a5f325aca> in <module>() 
----> 1 a = child_class() 

<ipython-input-56-99054bf26f0e> in __init__(self) 
10 
11  def __init__(self): 
---> 12   self.check_class() 
13 
14  def generate(self, size): 

<ipython-input-56-99054bf26f0e> in check_class(self) 
    5 
    6  def check_class(self): 
----> 7   assert self.generate([5,5]).shape == (5,5), 'Output of generate has the wrong shape' 
    8 
    9 class child_class(parent_class): 

AssertionError: Output of generate has the wrong shape 
+0

有什麼意圖,在什麼時候進行驗證檢查? –

+0

這個檢查可以在子類被實例化的時候完成(例如在上面的工作中)或者當方法被調用時 - 也可以! – fjhj2

+0

你能用父類方法來裝飾子類嗎? –

回答

0

您可以設置在創建實例級別(__new__())的檢查,以便它總是執行,例如:

class Parent(object): 

    def __new__(cls, *args, **kwargs): 
     instance = super(Parent, cls).__new__(cls) # create our instance 
     instance.check() # immediately call check on it 
     return instance # return it to the requestor 

    def check(self): 
     assert self.generate() == 10, "generate() must return 10" 

    def generate(self): 
     raise NotImplementedError 

class Child(Parent): 

    def generate(self): 
     return 10 

class BadChild(Parent): 

    def generate(self): 
     return 20 


child = Child() 
# everything's fine... 

parent = Parent() 
# NotImplementedError 

bad_child = BadChild() 
# AssertionError: generate() must return 10 

你也可以使用元類,但不要去那裏,如果你不需要它。作爲一個方面說明,我希望你沒有把這個東西當作你模塊的一種API,tho。不要編寫Javaesque Python - 將模塊的用戶視爲成年人,並明確你的模塊的期望。

相關問題