我有以下简化方案:
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,而没有它的那些将具有不同的变量初始化,尽管它们将具有相同的结构
答案 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
,则LS
为d.__qualname__
,否则为LS._score_funct
。
如果方法在NetworkAnalyzer._score_funct
类级别实现,则该方法有效。否则你可以替换为:
LS
当然如果方法被一些引发d.__qualname__.partition(".")[0] != "NetworkAnalyzer"
的代码覆盖,那将无效......这种方法不检查方法代码(无论如何都是危险的)