python - 如何告诉 pylint 组合类的子类可以访问父成员?

标签 python pylint

我有这个测试脚本:

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')

这可能不是很好的风格,但有效:HugeGetterClassHugeSetterClass 可以间接访问 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 成员,但无论如何都可以访问它。我有几个问题:

  1. 是否可以在这方面欺骗 pylint,而不是完全禁用错误类,这太笨重了?
  2. 这种编码风格是 pythonic 吗?如果不是,那么编写一个大类的替代方法是什么?我正在做的是在子类中分离功能(为了避免拥有变得难以管理的巨大源文件),即使这些子类总是一起使用。

最佳答案

问题是由于缺少 _cache 属性,您无法单独实例化和正确使用 HugeGetterClassHugeSetterClass。这就是为什么我建议您将 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/

相关文章:

python - Django,当我返回 status_code 404 或 500 时自定义 404/500

python - Matplotlib:pcolor() 不绘制最后一行和最后一列?

python - Tox:flake8 和 pylint 等工具的每个平台配置

python - pylint 没有发现明显的错误

使用pylint的python代码约定

python - Pylint 无效的常量名

eclipse - 让 Eclipse 识别 Pylint "pylint.rc"文件

python - 将 Django 模型传递给模板

python - 将 Django QuerySet 转换为 pandas DataFrame

python - Google App Engine 样板 - 联系人模板