相互调用的元类方法的最佳实践是什么?
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 忽略您的非错误。
我正在尝试构建一个元数据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 忽略您的非错误。