调用对方的元类方法的最佳做法是什么?

问题描述:

我正在尝试构建一个元类,我只是在想我真的懂了它。我想为这个元类的每个实例都有类方法。调用对方的元类方法的最佳做法是什么?

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因为那么它将是一个Metaclass方法。

相关搜索似乎是在讨论人们动态添加构造函数的地方,我不认为这是这种情况。我是否仍然对元类有所误解?

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

+0

https://*.com/questions/35208443/pylint-complains-no-value-for-argument-cls – SteveJ

+0

@SteveJ这就是我特别提到的情况。该问题中的OP期望构造函数在派生类中声明。这里不是这种情况。 – McKay

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

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

而且,因为这是一个元类,为了清晰,语义和可读性,最好按照以下方式进行:将第一个参数命名为cls而不是self

问题在于,pylint并没有提到这个问题:它很可能是一个硬编码的self。 你的代码在这方面是无法理解的。

所有你需要做的就是添加一个元注释foylint忽略这些行 - 幸运的是,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忽略您的非错误。

+0

+1,这很有道理。但我认为你的答案相当于“我认为这是pylint中的一个bug /限制,只是禁用它。”不是说我认为你错了,但这里没有什么是权威的。 – McKay

+0

我已经编辑了一个更清晰一点的问题标题。 – McKay

+0

这不会改变我的答案。有一部分内容在阅读“......这样做好得多”。 您只需注意,元类中的这些方法在类的实例中将不可见:它们只是类方法。 (这有时是一个优点,而且是一个设计,我希望Python的日期时间。datetime'已采取) – jsbueno