在Python中创建一个类摘要

问题描述 投票:1回答:1

我正在努力使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]
  • 我使用EFeatureObjectiveABC = 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)上运作,而SingletonObjectivesingle 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版本的类。感谢任何答案。

python abstract-class
1个回答
0
投票

如果你想要一个你无法实例化但可以子类的类,那么这是一种方法:

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`')
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.