派生 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的接口。
如何改进此代码?我有以下想法:
- 不要从
Cache
派生,只是利用它。
- 将基础 class 中的
store
方法重命名为 store_base
还有其他选择吗?
编辑
基础 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'))
以下代码:
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的接口。
如何改进此代码?我有以下想法:
- 不要从
Cache
派生,只是利用它。 - 将基础 class 中的
store
方法重命名为store_base
还有其他选择吗?
编辑
基础 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'))