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

时间:2014-01-07 08:30:16

标签: 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的一部分间接访问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成员,但无论如何都可以访问它。我有几个问题:

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

1 个答案:

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