如果一个类的构造函数返回一个子类?(Should a class constructor retur

2019-09-22 11:13发布

如果一个类的构造函数返回一个子类?

这主要是一个关于OOP的风格和Python风格的问题。 我有问题,我需要实现一般情况下的解决方案,并且对于性能方面的原因,我需要实现特定的输入类型的优化解决方案。 输入类型取决于用户。 目前,我已经子类一般情况下的解决方案,使优化的解决方案来实现这一点。 我想出了下面的例子来帮助描述我的意思。

from collections import Counter

class MyCounter(object):
    """General Case Counter"""
    def __init__(self, seq):
        self.seq = seq

    def count(self, key):
        return sum(key == item for item in self.seq)


class OptimizedCounter(MyCounter):
    """Counter optimized for hashable types"""
    def __init__(self, seq):
        self.counter = Counter(seq)

    def count(self, key):
        return self.counter.get(key, 0)

counter = MyCounter(['a', 'a', 'b', [], [0, 1]])
counter.count([0, 1])
# 1

counter = OptimizedCounter(['a', 'a', 'b'])
counter.count('a')
# 2

我的问题是我如何设计一个平滑的界面,使用户得到相应的实例,而不必担心它是如何实现的。 我认为做这样的事情下面,但感觉丑陋的我。 有没有更规范的或面向对象的方式做这样的事情?

class MyCounter(object):
    """General Case Counter"""
    def __new__(cls, seq):
        if hasOnlyHashables(seq):
            return object.__new__(OptimizedCounter)
        else:
            return object.__new__(MyCounter)

Answer 1:

使用工厂函数,返回适当类的一个实例。

def makeCounter(seq):
    if hasOnlyHashables(seq):
        return OptimizedCounter(seq)
    else:
        return MyCounter(seq)


Answer 2:

您分配的实现是有点过。 如果你需要创建一个子(或不同)的实例类型,那么你这样做,通过调用构造函数; 只是,如果你想创建当前类的实例,你应该调用父类的( object分配器在这种情况下)。



文章来源: Should a class constructor return a subclass?