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

Python 相互调用的元类方法的最佳实践是什么?,python,metaclass,pylint,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.\u foo有困难: [py

我正在尝试构建一个元类,我只是想我真的得到了它。我想为这个元类的每个实例提供类方法

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

    def _foo(cls):
        pass

    def _bar(cls):
        cls._foo()
当我在其上运行pylint时,
cls.\u foo
有困难:

[pylint] E1120:No value for argument 'cls' in unbound method call
当我试着运行代码时(我的代码比这更复杂),它似乎运行得很好,并且做了我期望它做的事情。那我该怎么解决这个案子呢?这到底意味着什么

这听起来像是与没有正确地将事物声明为
@staticmethods
相关的其他错误,但我不能将其标记为
@classmethod
,因为这样它将是一个元类方法

相关的搜索似乎在谈论人们动态添加构造函数或其他东西的地方,我认为情况并非如此。我对元类还是有些误解吗

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

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

就您的元类而言,您的
\u foo
\u 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会忽略您的非错误。

@SteveJ我特别提到过这种情况。该问题中的OP希望在派生类中声明构造函数。这里不是这样的。+1,这很有道理。但我认为你的答案相当于,“我认为这是pylint中的一个缺陷/限制,只需禁用它就行了。”我不是说我认为你错了,但这里没有任何权威性的东西。我编辑了问题的标题,以便更清楚一点。这不会改变我的答案。其中有一部分是这样写的:“……按照你所做的去做要好得多”。您只需要知道元类中的这些方法在类的实例中是不可见的:它们只是类方法。(这有时是一种优势,也是一种设计,我希望Python的
datetime.datetime
所采用的)“在实例中不可见”是一种可取的特性。