• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

python 来源:McKay 4次浏览

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

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方法。

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

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


===========解决方案如下:

[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)