[英]How to check output from a method in the child class has correct size
有沒有一種Python方式可以檢查父類的子類中方法的輸出。
例如,如果您具有這種結構,則我想對子類中“ 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])
下面的方法可以達到正確的效果,但是需要在子類的init方法中調用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])
如果您調用generate,現在將根據需要檢查輸出的大小是否正確:
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
您可以在實例創建級別( __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來使用。 不要編寫Javaesque Python-將您的模塊用戶視為成年人,並清楚說明您的模塊期望什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.