【问题标题】:Creating a simple metaclass创建一个简单的元类
【发布时间】:2013-03-28 02:19:02
【问题描述】:

我今天早些时候问了一个问题,我只想为我的问题找到一个解决方案。 我期待使用元类,但得到了一些不同的东西并且它起作用了。 但是,现在我对与我之前的问题相关的东西感兴趣:为什么我的元类不起作用?

这是我上一个问题的链接,但您无需阅读它即可回答此问题:How do I create a simple metaclass?

所以让我再次问这个问题,这一次是出于完全不同的原因:我如何创建一个简单的元类? 这就是我所拥有的,我不明白为什么它不起作用。

class MyMeta(type):
    def __new__(mcls, name, bases, attrs):
        attrs['my_attr'] = True     
        return super().__new__(mcls, name, bases, attrs)

class MyClass:
    __metaclass__ = MyMeta

print(MyClass.my_attr)

最后一行打印以下错误:

AttributeError: type object 'MyClass' has no attribute 'my_attr'

【问题讨论】:

  • 你在这里使用 Python 3 吗?您正在使用 print() 作为函数..
  • @MartijnPieters 是的,我使用的是 Python 3。显然错误不是由打印引起的。 Tt 清楚地说明出了什么问题,我只是不知道为什么。
  • 你必须在 Python 3 上声明 class MyClass(metaclass=MyMeta):
  • @JBernardo 谢谢,工作:)
  • @MarkusMeskanen:我问的原因是因为元类的语法在 2 和 3 之间有所不同,并且想确定我们在这里谈论的是什么版本。

标签: python class factory metaclass


【解决方案1】:

在 Python 3 中,你 specify the metaclass differently:

class MyClass(metaclass=MyMeta):
    pass

【讨论】:

  • 哦该死的,我已经阅读了几十篇关于元类的教程,并且只是按照我从他们那里学到的东西,没有看过 python 文档......似乎所有的教程都是针对 Python 2 . 谢谢,它现在工作了。 :)
猜你喜欢
  • 2013-03-28
  • 1970-01-01
  • 2019-06-22
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多