簡體   English   中英

如何檢查子類中方法的輸出具有正確的大小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM