我试图建立一个元类,我只是觉得我真的得到了它。我希望为这个元类的每个实例都有类方法。
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
,因为那时它将是一个元类方法。
相关搜索似乎在谈论人们动态添加构造函数或其他内容的地方,我不认为就是这种情况。我是否误解了有关元类的事情?
我真正想要的是在元类中定义的相互调用的类方法。有更好的方法吗?
答案 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会忽略你的非错误。