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

What is the best practice for metaclass methods that call each other?

我正在尝试构建一个元数据class,我只是觉得我真的明白了。我想为这个 metaclass.

的每个实例使用 class 方法
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

当我尝试 运行ning 代码(我的代码比这更复杂)时,它似乎 运行ning 很好,并且做了我期望它做的事情。那么我应该如何解决这个问题呢?具体是什么意思。

这听起来像是与未正确将事物声明为 @staticmethods 相关的其他错误,但我无法将其标记为 @classmethod,因为那样它将是 Metaclass 方法.

相关搜索似乎在谈论人们动态添加构造函数或其他东西的地方,我认为不是这种情况。我是不是对 metaclasses 有什么误解?

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

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

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

而且,由于这是一个元class,为了清晰、语义和可读性,最好按照您的做法进行操作:将他们的第一个参数命名为 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()

您的示例元class,带有 "meta-comment" 以便 pylint 忽略您的非错误。