我最近发现元类在蟒蛇。

基本上是一元类python一级创造一类。有许多有用的原因,为什么你会想这样做-任何种类的初始化的例子。注册上课的工厂、复验证的属性,改变如何继承工作,等等。这一切变得不仅是可能的,但是简单的。

但在python,元类也是普通课程。因此,我开始不知道如果的抽象可能有效地继续走高,而在我看来,它可以而且:

  • 一元类相当于或实现的一个作用模式(如在GOF模式语言)。
  • meta-元类模式本身(如果我们允许它创建组类表示抽象的角色,而不仅仅是一个单一的类)
  • meta-meta-元类是一个 图形的厂, ,这相当于GOF模式集团,例如创建、结构、行为。一个工厂里,你能描述一种情况下的某种类型的问题和它将给你一个组类,解决它。
  • meta-元元元类(尽我所能去),是一个 图形的厂厂, 工厂你也许可以描述类型问题和它将给你一个模式工厂的要求。

我找到了一些东西关于这个上网,但主要不是非常有用的。一个问题是,不同的语言元类定义略有不同。

有任何人使用元类似这python/其他地方,或看到这个在野外使用,或者想过吗?什么是类似的其他语言吗?E.g。C++如何深刻的可能的模板递归去了?

我会非常想研究它进一步。

有帮助吗?

解决方案

这类系统在一般是一个有趣的一项研究。在一般,一切都是一个目和每个对象有一类。这并不意味着层次结构中去。如果我没有记错的话,它会喜欢的东西:

5->整数>整数类>元类->元类类>元类->...(它循环)

其中'->'表示"是一个实例"。

其他提示

这提醒我永恒的追求,有些人似乎是在做一个"一般执行的一个模式。" 就像一个工厂,可以创造任何对象(其中包括一个工厂),或者一般用途的依赖注射的框架,是更为复杂的管理不是简单地写的代码实际上 什么东西。

我不得不处理与人的意图在抽象的点肚脐凝视着当我是管理Zend框架的项目。我拒绝了一堆的建议创建的部件,什么都没做,他们只是神奇的实现GoF模式,虽然该模式是一目标本身,而不是指向一个目标。

有点不断减少的返回对于抽象。一些抽象是巨大的,但最终你需要编写代码,不会有用的东西。

否则它只是 海龟的所有方式下.

来回答你的问题:没有。

随研究。

然而,请注意,你们混为一谈的设计模式(它们只是思想)的代码(这是一个实现。)

好的代码常常反映了一些环环相扣的设计图案。没有简单的方式正规化,这一点。你能做的最好是一个很好的画面,以及编写文档字符串和方法的名字,反映各种设计图案。

还注意到,一个超级是一类。这是一个循环。有没有更高级别的抽象概念。在这一点上,它仅仅是意图。这个想法的阶元类并不意味着很多--这是一个阶级的元课程,这是愚蠢的,但在技术上可能的。这一切都只是一类,但是。


编辑

"一些类创建元类真的太傻了?怎么他们用突然跑出来的?"

一个类创造一类是好的。那是很多的。事实上,目标类是一个阶级或一个抽象的超类或具体类并不重要。元类使课程。他们可能会做出其他元类,这是奇怪的,但他们仍然仅仅元类制作课程。

用"突然"的运行,因为没有实际的事情你需要的(甚至可以写)中的一个元类,使另一个元类.这并不是说它"突然"成为愚蠢的。这是那没有什么有用的。

因为我的种子,随意研究它。例如,实际编写元类,建立另一种元类.有乐趣。可能有一些有用的东西在那里。

点OO是要写类定义,这一模式的现实世界中的实体。因此,一个元类是有时会方便定义的交叉方面的若干相关课程。(这是一个办法做到的某些方面-为导向的方案编制。) 这就是所有的元类真的可以做的事;这是一个地方举行的一些功能,像 __new__(), 那不是正确的零件的类本身。

在历史的编程语言的会议在2007年,西蒙*佩顿*琼斯评论说,允许Haskell元编程使用类型的课程,但是,其真正的海龟一路下跌。你可元元元元等程序在Haskell,但是,他是从来没有听说过任何人使用超过3个级别的间接.

人斯蒂尔指出,它同样的事情在List和方案。你可以做元编程使用反引号和eval(你可以认为一个反引号为蟒蛇lambda,有点),但他从未见过超过3反引号的使用。

据推测,他们已经看到更多的代码比你或我曾经有,所以它只稍微夸张地说,没有一个已经超出了3个层次的元。

如果你想想看,大多数人永远不要使用元编程和两个水平是相当困难的环绕你头左右。我猜三几乎是不可能的,而最后一人试图四结束了在庇护。

因为当我第一次理解元类Python,我一直想知道"什么可以做一个元的阶级?".这是至少10年前和现在,只是几个月前,很明显对我来说,没有一个机构在蟒蛇类的创造,实际上涉及一个"meta-元"类。因此,它能够试着想象一下一些使用。

来回顾一下对象的实例在蟒蛇:每当一个实例中的一个对象Python由"呼吁"类用相同的语法使用的用于调一个普通的功能、类的 __new____init__.什么样的"安排"的呼唤的这些方法的类是完全类'metaclass' __call__ 法。通常当一个人写元类在蟒蛇, __new____init__ 方法的元类是定制的。

因此,事实证明,通过编写一个"meta-元"类之一可以定制它 __call__ 方法并因此控制其传递的参数和元类的 __new____init__ 方法,并且如果其他一些代码被称为前后的那些。什么样的实证明,在结束是,metcalsses自己通常是硬编码和一个只需要一些,如果有的话,即使在非常大的项目。因此,任何定制的,可能是在"meta元"呼吁通常是直接的元类本身。

和他们,也有一些其他不太经常使用Python元类-一个可以自定义 __add__ 方法中的一个元类以使这类定义是"可添加",并创建一个源类具有两个加班超类。这一机制是完全有效的具元类以及因此,所以只要我们"有一些实际代码",一个例子"meta-元"类,允许一个组成"元类"类只有通过增加他们在类宣言:

class MM(type):
    def __add__(cls, other):
        metacls = cls.__class__
        return metacls(cls.__name__ + other.__name__, (cls, other), {})

class M1(type, metaclass=MM):
    def __new__(metacls, name, bases, namespace):
        namespace["M1"] = "here"
        print("At M1 creation")
        return super().__new__(metacls, name, bases, namespace)

class M2(type, metaclass=MM):
    def __new__(metacls, name, bases, namespace):
        namespace["M2"] = "there"
        print("At M2 creation")
        return super().__new__(metacls, name, bases, namespace)

我们可以看到,工作上的互动控制台:

In [22]: class Base(metaclass = M1 + M2): 
    ...:     pass
    ...: 
At M1 creation
At M2 creation

注意,正如不同元类Python通常是难以结合起来,这实际上可以是有益的通过允许用户制作的元类以结合与一个图书馆或标准库之一,没有这一个具有明确宣布,作为父母的原:

In [23]: import abc

In [24]: class Combined(metaclass=M1 + abc.ABCMeta):
    ...:     pass
    ...: 
At M1 creation
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top