本文小编为大家详细介绍“python的metaclass有什么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“python的metaclass有什么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。类也是对象在理解metaclass之前,我们先要掌握python中的类(class)是什么。python中类的概念,是借鉴自smalltalk语言。在大部分语言中,类指的是”描述如何产生一个对象(object)”的一段代码,这对于python也是如此。但是,在python中,类远不止如此,类同时也是对象。当你遇到关键词class的时候,python就会自动执行产生一个对象。下面的代码段中:python在内存中产生了一个名叫做”ObjectCreator”的对象。这个对象(类)自身拥有产生对象(实例instance)的能力。 这就是为什么称呼这东西(后面遇到容易混淆的地方,我们称之为:类对象)也是类的原因。同时,它也是一个对象,因此你可以对它做如下操作:赋值给变量复制它为它增加属性(attribute)作为参数传值给函数举例:动态创建类既然类也是对象,那么我们就可以在运行的时候创建它,跟创建对象一样自然。首先,我们使用class关键字定义一个产生类的函数:这很容易理解吧。但是,这并不那么动态啊。我们还是需要自己来写这个类的代码。既然类也是对象,那就应该有用来产生它的东西。这东西就是type。先来说说你所认识的type。这个古老而好用的函数,可以让我们知道一个对象的类型是什么。实际上,type还有一个完全不同的功能,它可以在运行时产生类。type可以传入一些参数,然后返回一个类。(好吧,必须承认,根据不同的传入参数,一个相同的函数type居然会有两个完全不同的作用,这很愚蠢。不过python这样做是为了保持向后兼容性。)下面举例type创建类的用法。首先,对于类一般是这么定义的:在下面,MyShinyClass也可以这样子被创建出来,并且跟上面的创建方法有一样的表现:type创建类需要传入三个参数,分别为:类 香港云主机的名字一组”类的父类”的元组(tuple) (这个会实现继承,也可以为空)字典 (类的属性名与值,key-value的形式,不传相当于为空,如一般写法中的pass).下面来点复杂的,来更好的理解type传入的三个参数:等价于:想要看点有继承关系的类的实现,来:等价于:回顾一下我们学到哪了: 在python中,类就是对象,并且你可以在运行的时候动态创建类.那到底什么是metaclass(元类)metaclass 就是创建类的那家伙。(事实上,type就是一个metaclass)我们知道,我们定义了class就是为了能够创建object的,没错吧?我们也学习了,python中类也是对象。那么,metaclass就是用来创造“类对象”的类.它是“类对象”的“类”。可以这样子来理解:也可以用我们上面学到的type来表示:说白了,函数type就是一个特殊的metaclass.python在背后使用type创造了所有的类。type是所有类的metaclass.我们可以使用__class__属性来验证这个说法.在python中,一切皆为对象:整数、字符串、函数、类.所有这些对象,都是通过类来创造的.那么,__class__的__class__又是什么呢?metaclass就是创造类对象的工具.如果你喜欢,你也可以称之为”类的工厂”.type是python內置的metaclass。不过,你也可以编写自己的metaclass.__metaclass__ 属性我们可以在一个类中加入 __metaclass__ 属性.当你这么做了,python就会使用metaclass来创造类:Foo。注意啦,这里有些技巧的。当你写下class Foo(object)的时候,类对象Foo还没有在内存中生成。python会在类定义中寻找__metaclass__ 。如果找到了,python就会使用这个__metaclass__ 来创造类对象: Foo。如果没找到,python就使用type来创造Foo。请把下面的几段话重复几遍:当你写如下代码的时候:python做了以下事情:Foo中有__metaclass__这个属性吗?如果有,python会在内存中通过__metaclass__创建一个名字为Foo的类对象。如果python没有在Foo中找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__,并尝试做和前面同样的操作。如果python由下往上遍历父类也都没有找不到__metaclass__,它就会在模块(module)中去寻找__metaclass__,并尝试做同样的操作。如果还是没有找不到__metaclass__, python才会用内置的type(这也是一个metaclass)来创建这个类对象。现在问题来了,我们要怎么用代码来实现__metaclass__呢? 写一些可以用来产生类(class)的东西就行。那什么可以产生类?无疑就是type,或者type的任何子类,或者任何使用到type的东西都行.自定义metaclass使用metaclass的主要目的,是为了能够在创建类的时候,自动地修改类。一个很傻的需求,我们决定要将该模块中的所有类的属性,改为大写。有几种方法可以做到,这里使用__metaclass__来实现.在模块的层次定义metaclass,模块中的所有类都会使用它来创造类。我们只需要告诉metaclass,将所有的属性转化为大写。这里的方式其实不是OOP(面向对象编程).因为我们直接调用了type,而不是改写父类的__type__方法.所以我们也可以这样子处理:这样子看,我们只是复用了 type.__new__方法,这就是我们熟悉的基本的OOP编程,没什么魔法可言.你可能注意到,__new__方法相比于多了一个参数: upperattr_metaclass, 请别在意,这没什么特别的: __new__总是将”它要定义的类”作为***个参数。这就好比是 self 在类的一般方法(method)中一样,也是被作为***个参数传入。当然啦,这里的名字的确是我起的太长了。就像self一样,所有的参数都有它们传统的名称。因此,在实际的代码中,一个metaclass应该是写成下面样子的:(我们同时使用常见的super来让代码更清晰)使用了 metaclass 的代码是比较复杂,但我们使用它的原因并不是为了复杂, 而是因为我们通常会使用 metaclass 去做一些晦涩的事情,比如, 依赖于自省,控制继承等等。确实,用 metaclass 来搞些“黑魔法”是特别有用的,因而会复杂化代码。但就metaclass本身而言,它们其实是很简单的:中断类的默认创建、修改类、***返回修改后的类.到底为什么要使用metaclass现在我们面临一个问题: 为什么要使用metaclass? 它容易出错且晦涩难懂.好吧,一般来说,我们根本就用不上它, 99%的用户应该根本不必为此操心。实际用到metaclass的人,很清楚他们到底需要做什么,根本不用解释为什么要用.metaclass 的一个主要用途就是构建API。Django(一个python实现的web框架)的ORM 就是一个例子。用Django先定义了以下Model:然后执行下面代码:这里打印的输出并不是IntegerField,而是一个int,int是从数据库中获取的.这是因为 models.Model 使用 __metaclass__来实现了复杂的数据库查询。但对于你看来,这就是简单的API而已,不用关心背后的复杂工作。读到这里,这篇“python的metaclass有什么用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注开发云行业资讯频道。
本篇内容主要讲解“如何用Vue命名插槽创建多个模板插槽”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用Vue命名插槽创建多个模板插槽”吧!Vue 插槽允许将父组件中的内容注入到子组件中。这是最基本的示例,如果我…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。