gpt4 book ai didi

python - 在Python中创建一个抽象类

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:56 26 4
gpt4 key购买 nike

我正在努力将 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]
  • 我使用 ABC = abc.ABCMeta('ABC', (object,), {'__slots__': ()}) 将 EFeatureObjective 作为抽象并有

        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中实现了这个方法,问题是语法方面这可以实现吗? SingletonObjective 中不提供这些功能。基本上,EFeatureObjective 作用于(eFeatures 列表)SingletonObjective 作用于此目标内的单个 eFeature

  • 然后,我在 SingletonObjective 中调用了抽象类 EFeatureObjective 抽象方法 calculate_feature_scores,如下

     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`')

关于python - 在Python中创建一个抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55893085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com