派生 class 具有不同的界面

Derived class with differing interface

以下代码:

class Cache:

    def __init__(self):
        self._cache = []

    def store(self, data):
        self._cache.append(data)

    def stats(self):
        print('We are caching {} elements'.format(len(self._cache)))


class LegoCache(Cache):

    def store(self, weight, color):
        Cache.store(self, (weight, color))

有一个问题是store方法没有实现基础class的接口。

如何改进此代码?我有以下想法:

还有其他选择吗?

编辑

基础 class 还必须支持其他用例:

class ZombieCache(Cache):

    def store(self, dead_since, humans_eaten, can_be_saved=False):
        Cache.store(self, dict(
            dead_since=dead_since, 
            humans_eaten=humans_eaten, 
            can_be_saved=can_be_saved))

您可以在基础中使用可变参数列表 class:

class Cache:

    def __init__(self):
        self._cache = []

    def store(self, *args):
        self._cache.append(args)

    def stats(self):
        print('We are caching {} elements'.format(len(self._cache)))

class LegoCache(Cache):
    pass
    # "overloading" store isn't needed

因此不需要重载此方法或为特殊情况添加不同名称的方法:

cache = Cache()
legoCache = LegoCache()

cache.store(x)
legoCache.store(x, y)

另一个解决方案可能是委托:

class LegoCache(object):
    def __init__(self):
        self.cache = Cache()

    def store(self, weight, color):
        self.cache.store((weight, color))
        # or just self.cache.store(weight, color) if you use the *args implementation

我会这样实现,

class Cache:

  def __init__(self):
      self._cache = []

  def store(self, data):
      self._cache.append(data)

  def stats(self): 
      print('We are caching {} elements'.format(len(self._cache)))


class LegoData(object):

  def __init__(self, weight, color):
      self.weight = weight
      self.color = color

class LegoCache(Cache):
   pass

客户端会这样访问,

lego_cache = LegoCache()
lego_cache.store(LegoData(weight=10, color='Green'))