我有这个测试脚本:
class HugeGetterClass:
def __init__(self):
pass
def getMe(self, key):
return self._cache.get(key)
class HugeSetterClass:
def __init__(self):
pass
def setMe(self, key, value):
self._cache[key] = value
class ContainerClass(HugeGetterClass, HugeSetterClass):
def __init__(self):
HugeGetterClass.__init__(self)
HugeSetterClass.__init__(self)
self._cache = { }
a = ContainerClass()
a.setMe('a', 'Hello')
print a.getMe('a')
这可能不是很好的风格,但有效:HugeGetterClass
和HugeSetterClass
可以通过成为self._cache
的一部分间接访问ContainerClass
。但是运行pylint
会给出:
» pylint -E composing.py
No config file found, using default configuration
************* Module composing
E: 7,15:HugeGetterClass.getMe: Instance of 'HugeGetterClass' has no '_cache' member
E: 15,8:HugeSetterClass.setMe: Instance of 'HugeSetterClass' has no '_cache' member
这是可以理解的,但它让我很烦。这些类没有_cache
成员,但无论如何都可以访问它。我有几个问题:
pylint
,而不会完全禁用错误类,这太过分了? 答案 0 :(得分:3)
问题是由于缺少HugeGetterClass
属性,您无法自行实例化并正确使用HugeSetterClass
和_cache
。这就是我建议您用pass
替换self._cache = {}
语句的原因。它不仅仅是修补pylint错误,还涉及使你的代码更加pythonic和可调制。
无论如何,如果你不希望这些类可以实例化,那么Python有一个工具:ABC (Abstract Base Classes)。 这允许您使用抽象方法和属性定义基类。
以下是使用abc尝试实现的简单示例:
from abc import ABCMeta, abstractproperty
class HugeGetterClass:
__metaclass__ = ABCMeta
def get_me(self, key):
return self.cache_access.get(key)
@abstractproperty
def cache_access(self):
return {}
class ContainerClass(HugeGetterClass):
def __init__(self):
HugeGetterClass.__init__(self)
self._cache = {"a":"Hello"}
@property
def cache_access(self):
return self._cache
a = ContainerClass()
print a.get_me('a')