问题标签 [metaclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1036 浏览

perl - 如何创建一个新的 Moose 类并在运行时实例化该类的对象?

使用创建元类后Moose::Meta::Class->create,如何将该类作为元类实例化一个真正的 Moose 类?(我还需要创建元类,因为我还想为其应用一些角色。)

0 投票
3 回答
6151 浏览

python - 使用元类实现工厂设计模式

我发现了很多关于元类的链接,其中大多数都提到它们对于实现工厂方法很有用。你能告诉我一个使用元类来实现设计模式的例子吗?

0 投票
2 回答
4540 浏览

ruby - Ruby 元类疯狂

我被困住了。我正在尝试动态定义一个类方法,但我无法理解 ruby​​ 元类模型。考虑以下类:

显然这两种方法都返回一个 Class 的实例。但这两个实例并不相同。他们也有不同的祖先:

区分元类和类实例有什么意义?

我发现,我可以send :define_method对元类动态定义一个方法,但是如果我尝试将它发送到类实例,它将无法工作。至少我可以解决我的问题,但我仍然想了解它为什么会这样工作。

更新 2010 年 3 月 15 日 13:40

以下假设是否正确。

  • 如果我有一个调用 self.instance_eval 并定义一个方法的实例方法,它只会影响该类的特定实例。
  • 如果我有一个调用 self.class.instance_eval 的实例方法(这与调用 class_eval 相同)并定义了一个方法,它将影响该特定类的所有实例,从而产生一个新的实例方法。
  • 如果我有一个调用 instance_eval 并定义一个方法的类方法,它将为所有实例生成一个新的实例方法。
  • 如果我有一个类方法,它在元/特征类上调用 instance_eval 并定义一个方法,它将产生一个类方法。

我认为它开始对我有意义。如果类方法中的 self 指向 eigen 类,那肯定会限制您的可能性。如果是这样,就不可能从类方法内部定义实例方法。那是对的吗?

0 投票
2 回答
5092 浏览

python - Python:使用用户输入作为类名的类工厂

我想动态地将类属性添加到超类。此外,我想创建从这个超类动态继承的类,这些子类的名称应该取决于用户输入。

有一个超类“Unit”,我可以在运行时向其中添加属性。这已经奏效了。

这将导致所需的输出:
Myarcher 的强度:5
Myarcher 的强度:2

但是现在我不想预定义子类Archer,而是让用户决定如何调用这个子类。我试过这样的事情:

但没有运气。我想我还没有真正理解new在这里做了什么。结果我想要的是

由工厂创建。如果我用参数“Knight”调用工厂,我想创建一个 Knight 类,Unit 的子类。

有任何想法吗?提前谢谢了!
再见
-佐野

0 投票
3 回答
2159 浏览

python - 我应该使用元类、类装饰器还是重写 __new__ 方法?

这是我的问题。我希望下面的类有一堆属性。我可以像fooand一样将它们全部写出来bar,或者基于我见过的其他一些示例,看起来我可以使用类装饰器、元类或重写__new__方法来自动设置属性。我只是不确定这样做的“正确”方法是什么。

0 投票
6 回答
173920 浏览

ruby - class << Ruby 中的自成语

class << selfRuby中做什么?

0 投票
2 回答
1317 浏览

python - 用于强制自定义类型的不变性的 Python 元类

在寻找一种方法来强制自定义类型的不变性并且没有找到令人满意的答案后,我想出了一个元类形式的解决方案:

然而,虽然一般方法似乎运作良好,但仍有一些不确定的实现细节(另见代码中的 TODO 注释):

  1. 如何检查特定方法是否已在类型层次结构中的任何位置实现?
  2. 如何检查哪种类型是方法声明的来源(即作为已定义方法的类型的一部分)?
0 投票
5 回答
2049 浏览

python - 具有集成查询集的子类 django 模型

就像在这个问题中一样,除了我希望能够拥有返回混合对象的查询集:

我发现我不能只设置Product.Meta.abstract为 true 或者只是将不同对象的查询集或在一起。很好,但是这些都是公共类的子类,所以如果我将它们的超类保留为非抽象类,我应该很高兴,只要我能让它的管理器返回正确类的对象。django 中的查询代码完成了它的工作,只是调用 Product()。听起来很简单,除了当我覆盖它时它会爆炸Product.__new__,我猜是因为__metaclass__模型中的......这是非django代码,其行为几乎符合我的要求:

但是,如果我继承 fromdjango.db.models.Model而不是object

这是一个非常糟糕的回溯;我也无法__new__在调试器中进入我的代码框架。我已经不同地尝试了super(A, cls), Top, super(A, A), 以及以上所有方法,并结合cls作为第一个参数传入__new__,但都无济于事。为什么这踢我这么狠?我是否必须弄清楚 django 的元类才能解决这个问题,还是有更好的方法来实现我的目标?

0 投票
6 回答
9122 浏览

python - python中的type和type.__new__有什么区别?

我正在编写一个元类,并且不小心这样做了:

...而不是像这样:

这两个元类之间到底有什么区别?更具体地说,是什么导致第一个不能正常工作(元类没有调用某些类)?

0 投票
2 回答
1677 浏览

python - Ruby 与 Python 元类的类比是什么?

Python 有元类的想法,如果我理解正确的话,它允许您在构造时修改类的对象。您不是在修改类,而是要创建然后初始化的对象。

Python(我相信至少从 3.0 开始)也有类装饰器的想法。同样,如果我理解正确,类装饰器允许在声明类定义时对其进行修改。

现在我相信 Ruby 中的类装饰器有一个或多个等效功能,但我目前不知道与元类等效的东西。我敢肯定,您可以通过一些函数轻松地抽取任何 Ruby 对象并对其执行任何操作,但是该语言中是否有一个特性可以像元类一样设置它?

再说一遍,Ruby 是否有类似于 Python 的元类的东西?

编辑我对 Python 的元类很感兴趣。元类和类装饰器做的事情看起来非常相似。它们都在定义类时修改类,但方式不同。希望 Python 大师能进来并更好地解释 Python 中的这些特性。

但是一个类或一个类的父类可以实现一个__new__(cls[,..])函数,该函数在用 初始化对象之前定制它的构造__init__(self[,..])

编辑这个问题主要是为了讨论和学习两种语言在这些特性上的比较。我熟悉 Python 但不熟悉 Ruby 并且很好奇。希望其他对这两种语言有相同问题的人会发现这篇文章很有帮助和启发。