我正在努力使EFeatureObjective
成为抽象的,我知道我可以实现一个类,只是让calculate_feature_scores
作为抽象但我做的事情 -
class EFeatureObjective(bluepyopt.objectives.Objective):
"""EPhys feature objective"""
def __init__(self, name, features=None):
"""Constructor
Args:
name (str): name of this object
features (list of eFeatures): features used in the Objective
"""
super(EFeatureObjective, self).__init__(name)
self.name = name
self.features = features
def calculate_feature_scores(self, responses):
"""Calculate the scores for the individual features"""
scores = []
for feature in self.features:
scores.append(feature.calculate_score(responses))
return scores
class SingletonObjective(EFeatureObjective):
"""Single EPhys feature"""
def __init__(self, name, feature):
"""Constructor
Args:
name (str): name of this object
features (EFeature): single eFeature inside this objective
"""
super(SingletonObjective, self).__init__(name, [feature])
def calculate_score(self, responses):
"""Objective score"""
return self.calculate_feature_scores(responses)[0]
def __str__(self):
"""String representation"""
return '( %s )' % self.features[0]
EFeatureObjective
将ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()})
作为抽象而已
def calculate_feature_scores(self, responses):
pass
喜欢
import abc
ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()})
class EFeatureObjective(bluepyopt.objectives.Objective, ABC):
"""EPhys feature objective"""
def __init__(self, name, features=None):
"""Constructor
Args:
name (str): name of this object
features (list of eFeatures): features used in the Objective
"""
super(EFeatureObjective, self).__init__(name)
self.name = name
self.features = features
@abc.abstractmethod
def calculate_feature_scores(self, responses):
pass
class SingletonObjective(EFeatureObjective):
.........
def calculate_feature_scores(self, responses):
"""Calculate the scores for the individual features"""
scores = []
for feature in self.features:
scores.append(feature.calculate_score(responses))
return scores
然后我在SingletonObjective
中实现了这个方法,问题是语法明智可以实现吗? features
不提供SingletonObjective
。基本上EFeatureObjective
在(list of eFeatures)
上运作,而SingletonObjective
在single eFeature inside this objective
上运作。EFeatureObjective
里面调用抽象类calculate_feature_scores
抽象方法SingletonObjective
def calculate_feature_scores(self, responses):
super(SingletonObjective, self).calculate_feature_scores(responses)
但是之后
def calculate_score(self, responses):
"""Objective score"""
return self.calculate_feature_scores(responses)[0]
索引会出错。我已经安静了一段时间,现在我希望EFeatureObjective
是抽象的,而不是创建一个使用不同Python版本的类。感谢任何答案。
如果你想要一个你无法实例化但可以子类的类,那么这是一种方法:
class BaseClass(object):
def __new__(cls):
''' If this is not a subclass being instanciated, then raise an error '''
if cls is BaseClass:
raise TypeError('Cannot instantiate this')
return object.__new__(cls)
AbstractMethod1 = None
def __init_subclass__(cls):
''' Anytime subclasses are created, make sure they have the right methods '''
if cls.AbstractMethod1 is None:
raise TypeError('All subclasses of `base` must define `AbstractMethod1`')