相互调用的元类方法的最佳实践是什么?

时间:2017-12-03 04:42:44

标签: python metaclass pylint

我试图建立一个元类,我只是觉得我真的得到了它。我希望为这个元类的每个实例都有类方法。

class MyMeta(type):
    """A metaclass"""
    def __new__(mcs, name, bases, attributes):
        pass

    def _foo(cls):
        pass

    def _bar(cls):
        cls._foo()

当我在其上运行pylint时,cls._foo有困难:

[pylint] E1120:No value for argument 'cls' in unbound method call

当我尝试运行代码时(我的代码比这更复杂),它似乎运行正常,并且正在做我期望它做的事情。那我该怎么办呢?这恰恰是什么意思。

这听起来像其他与未正确声明为@staticmethods的内容相关的错误,但我无法将其标记为@classmethod,因为那时它将是一个元类方法。

相关搜索似乎在谈论人们动态添加构造函数或其他内容的地方,我不认为就是这种情况。我是否误解了有关元类的事情?

我真正想要的是在元类中定义的相互调用的类方法。有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  

[pylint] E1120:参数没有价值' cls'在未绑定的方法调用中

就您的元类而言,您的_foo_bar方法只是普通的Python方法 - 这意味着Python会在调用这些方法时自动填充对每个类(元类实例)的引用。

而且,由于这是一个元类,为了清晰,语义和可读性,最好像你一样做:将第一个参数命名为cls而不是self

问题在于,pylint并不知道这一点:很可能它正在期待一个硬编码的self。 你的代码在这方面是不可思议的。

你所要做的就是添加一个元注释,即pylint忽略这些行 - 幸运的是,Pylint允许它在块级别,不像你必须在每一行中标记它的一些工具。

class MyMeta(type):
    """A metaclass"""
    # pylint: disable=no-value-for-parameter

    def __new__(mcs, name, bases, attributes):
        pass

    def _foo(cls):
        pass

    def _bar(cls):
        cls._foo()

您的示例元类,使用"元评论"这样pylint会忽略你的非错误。