我有这个测试脚本:
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
,作为容器类
。但是运行 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
,而不是完全禁用错误类,这太笨重了? - 这种编码风格是 pythonic 吗?如果不是,那么编写一个大类的替代方法是什么?我正在做的是在子类中分离功能(为了避免拥有变得难以管理的巨大源文件),即使这些子类总是一起使用。
最佳答案
问题是由于缺少 _cache
属性,您无法单独实例化和正确使用 HugeGetterClass
和 HugeSetterClass
。这就是为什么我建议您将 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')
关于python - 如何告诉 pylint 组合类的子类可以访问父成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20967063/