检查函数是否在Python中调用之前引发NotImplementedError

时间:2018-04-18 15:07:13

标签: python python-3.x class oop

我有以下简化方案:

class NetworkAnalyzer(object):
    def __init__(self):
       print('is _score_funct implemented?')

    @staticmethod
    def _score_funct(network):
        raise NotImplementedError

class LS(NetworkAnalyzer):
    @staticmethod
    def _score_funct(network):
        return network

我正在寻找我应该使用的代替print('is _score_funct implemented?')的内容,以便弄清楚子类是否已经实现了_score_funct(network)

注意:如果有更多的pythonic /传统方式来构造代码,我也很感激它的提及。我这样定义它的原因是,一些NetworkAnalyzer子类在它们的定义中有_score_funct,而没有它的那些将具有不同的变量初始化,尽管它们将具有相同的结构

2 个答案:

答案 0 :(得分:3)

使用抽象基类,除非它实现了所有抽象方法,否则您无法实例化该类:

import abc

class NetworkAnalyzerInterface(abc.ABC):
    @staticmethod
    @abc.abstractmethod
    def _score_funct(network):
        pass

class NetworkAnalyzer(NetworkAnalyzerInterface):
    def __init__(self):
        pass

class LS(NetworkAnalyzer):
    @staticmethod
    def _score_funct(network):
        return network

class Bad(NetworkAnalyzer):
    pass

ls = LS()   # Ok
b = Bad()   # raises TypeError: Can't instantiate abstract class Bad with abstract methods _score_funct

答案 1 :(得分:1)

我不是元类/类专家,但这里的方法适用于您的简单情况(不确定它是否在复杂/嵌套类名称空间中工作):

要检查方法是否被覆盖,可以在函数名称上尝试extension ViewController: WKNavigationDelegate, WKUIDelegate { public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? { let newWebView = WKWebView(frame: self.webView.frame, configuration: configuration) view.addSubview(newWebView) return newWebView } } ,然后检查限定名称(类部分使用字符串分区就足够了):

getattr

如果class NetworkAnalyzer(object): def __init__(self): funcname = "_score_funct" d = getattr(self,funcname) print(d.__qualname__.partition(".")[0] == self.__class__.__name__) 中定义了_score_funct,则LSd.__qualname__,否则为LS._score_funct

如果方法在NetworkAnalyzer._score_funct类级别实现,则该方法有效。否则你可以替换为:

LS

当然如果方法被一些引发d.__qualname__.partition(".")[0] != "NetworkAnalyzer" 的代码覆盖,那将无效......这种方法不检查方法代码(无论如何都是危险的)

相关问题