DAY29、元类】的更多相关文章

元类及异常处理 元类 什么是元类 在python中,一切皆对象,对象是由类产生的,那么类是不是对象呢? 举例: class A: pass print(type(A)) # <class 'type'> 从上例中可以看出,在python中,类也是对象,是由某个兑现实例化来的,而且这个类的名字叫做type,那么这个类又是什么呢?这个类就是元类 元类就是产生类的的类 实例化类对象 普通的类是由元类实例化产生的,那么我们如何按照普通类的方式去生成类对象呢? 由于定义类时会使用class关键字,实际上…
一.eval内置函数eval内置函数的使用场景: 1.执行字符串会得到相应的执行结果 2.一般用于类型转换,得到dict.list.tuple例: dic_str = ''{'a':1,'b':2}'' print(eval(dic_str)) # {'a':1,'b':2} with open(txt,'r',encoding='utf-8')as f: data_str = f.read() res = eval(data_str)二.exec内置函数exec应用场景: 1.执行字符串,没有…
一.eval.exec内置函数 1.eval函数 eval内置函数的使用场景: ①执行字符串会得到相应的执行结果 ②一般用于类型转换得到dict.list.tuple等 2.exec函数 exec应用场景 用来辅助了解元类的概念 ①执行字符串没有执行结果(没有返回值) ②将执行的字符串中产生的名字形成对应的局部名称空间 # 解析exec函数 # exec函数帮我们运行字符串中的代码,把字符串中产生的名字放到名称空间里 # 自己定义全局作用域中的名字和字典,自己定义局部作用域的名字和字典 # 将所…
本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保存到对应的父类元组的childrens的集合中. 同时对__str__打印方法和__iter__迭代方法进行了定义,其中: __iter__方法返回类名的childrens集合,并对其中的元素进行输入. 而Sharp继承自RegisterClasses, 当 for s in Sharp: prin…
转载自  http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段.在Python中这一点仍然成立:           Python   1 2 3 4 5 6 >>> class ObjectCreator(object): …       pass … >>> my_obje…
问题:Python中的元类(metaclasses)是什么?一般使用它干什么? 原地址:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 元类是一个类的类.就像一个类定义了其实例的行为,一个元类定义了其对应类的行为.类是元类的一个实例. 其实Python中的元类在平常编码中很难用到,我现在所知的Python代码使用元类的场景只有ORM 想了解的话可以从浏览原地址的答案,或者廖雪峰Python教程:htt…
python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试…
这两天在看Django框架,里面的filter实现原理搞不明白,最后发现跟python的元类有关系. 原文:http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python 伯乐在线译文:http://blog.jobbole.com/21351/ 我就把我看完着两边(中英文)的收获简短的写一下,但是我还是强烈推荐看上面的两篇文章, 元类本身而言,它们其实是很简单的: 1)   拦截类的创建 2)   修改类 3)  …
一.概述 二.经典阐述 三.核心总结 1.类的创建过程 2.元类的使用惯例 四.简单案例 1.默认行为 2.使用元类 五.实践为王 一.概述 Python虽然是多范式的编程语言,但它的数据模型却是 纯面向对象 的.与那些仅在语法层面声称纯OO的编程语言(如Java)相比,Python的这种纯粹性更加深入骨髓. 在Python的世界里,一切皆为对象:数值.序列.字典.函数.模块.文件.类.类实例 等等,无一例外(参考 Data model).其中,"类也是对象" 的概念最让人匪夷所思,这…
1.什么是元类 元类让你来定义某些类是如何被创建的,从根本上说,赋予你如何创建类的控制权.可以把元类想成是一个类中类,或是一个类,它的实例是其它的类.当某个类调用type()函数时,你就会看到它到底是谁的实例. >>> class C(object): pass   >>> class CC: pass   >>> type(C) <type 'type'> >>> type(CC) <type 'classobj'…
本文由 伯乐在线 - bigship 翻译 英文出处:stackoverflow 译文:http://blog.jobbole.com/21351/ 译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了9…
metaClass 实现动态改变对象的能力,这点特别像python(metaClass),Python中类(不是元类)的概念借鉴于Smalltalk groovy demo: class Person { String name } // 添加自我介绍的行为 Person.metaClass.introduce << {println "I'm $name"} // 添加性别属性,默认为男(Male) Person.metaClass.sex = "Male&qu…
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6…
大家可能很熟悉在collections模块中有一个很好用的扩展数据类型-namedtuple. 如果你还不知道这个类型,那么请翻看标准手册. 我利用元类轻松定义一个namedtuple. 先把代码贴上,满足心急的朋友. def myNamedTuple(tuple_name, attrs_str): attrs_set = set(attrs_str.split(' ')) def __init__(self, attrs): #我们将来实例初始化的时候需要调用的方法. for key, val…
元类的介绍 请看位于下面网址的一篇文章,写的相当好. http://blog.jobbole.com/21351/ 实例补充 class Meta(type): def __new__(meta, cls, parent, attr_dict): res = super(Meta, meta).__new__(meta,cls, parent, attr_dict) print('meta new stage, %s is %s, %s is %s' % (meta, type(meta), c…
1:元类 元类:类的创建与管理者 所有类的元类是type class a: pass print(type(a)) 结果:<class 'type'> 2:定制元类 类的实例化过程:(可看类的基础与要点) 1)调用__new__()创建实例 2)调用__init__()初始化上面创建出来的实例 所以:定制实例便是改变父类的__new__()或__init__()方法 例子: class MyMeta(type): def __init__(self,name,bases,dicts): pri…
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #元编程 #new-style类带来了一种能力,通过2个特殊方法(__new__和__metaclass__)在运行时修改类和对象的定义 #__new__方法 #它是一上元构建程序,每次一个对象被factor类实例化时就调用它 #例如: class A(object): def __new__(cls,): print '__new__' return object…
刚開始接触到Python新式类中的元类的概念的时候非常是纠结了下..不知道这是个啥东西... 用下面几个定义来说明吧: (1)Python中,类也是对象..仅仅只是这样的对象比較的特殊,他用于创建别的对象 (2)元类也是一种类,仅仅只是它更特殊...他是用来创建别的类的类...(呵呵,是不是非常拗口) 先来看一段代码吧: class Fjs(object): def __init__(self, name): self.name = name def hello(self): print "he…
当你创建一个类时: class Foo(Bar): pass Python做了如下的操作: Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__创建一个名字为Foo的类对象(我说的是类对象,请紧跟我的思路).如果Python没有找到__metaclass__,它会继续在Bar(父类)中寻找__metaclass__属性,并尝试做和前面同样的操作.如果Python在任何父类中都找不到__metaclass__,它就会在模块层次中去寻找__me…
type()函数既可以返回一个对象的类型,又可以创建出新的类型 def fn(self, name="world"): print("Hello, %s!" % name) Hello = type("Hello", (object,), dict(hello=fn)) h = Hello() >>> h.hello() Hello, world! >>> type(h) Out[165]: __main__.…
元类(meta class),这个名字想必很多人都听过,网上也有很多关于元类的介绍,今天我就按照自己这两天的理解来简单探讨一下这个玩意,有误之处还望指出. 首先,下载objc源码,源码地址:https://opensource.apple.com/tarballs/objc4/打开链接后会发现有很多版本,我直接下载的最新版(709版本) 认识NSObject 1.打开objc工程的NSObject.h,找到NSObject类的定义 @interface NSObject <NSObject>…
1.用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范. Python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法.元类可以通过 __new__ 方法,获取子类.孙子类的名称,父亲及属性. 这样使得我们不需要将验证代码放在本类 __init__ 方法中,等到构建对象再验证. 下例中,定义一个边数小于3的子类,class语句一结束,元类的验证代码就会拒绝这个class. class ValidatePolygon(type): d…
推荐+收藏:深刻理解Python中的元类(metaclass) 做一些笔记学习学习: 在大多数编程语言中,类就是用来描述如何生成一个对象的代码段,在Python中类也是一个对象,这个(类)对象自身拥有创建对象(类实例)的能力. 因为它的本质是一个对象: 可以将它赋值给一个变量 可以拷贝它 增加属性 作为参数进行传递 可以在运行时动态地创建他们,可以在函数中创建类,只需要使用class关键字即可 当使用class关键字的时候,Python解释器会自动地创建这个对象,Python还提供了手动处理的方…
关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一个type类,所有的类都是基于type类生成的,可谓万物之母. 如此广袤无垠的python生态圈,都是由type产生出来的. Python面向对象总计包含五大部分: 常用部分: 3.class(类,或者叫实例生成器) 4.instance(实例) 5.实例的各种属性与方法,我们平常使用python时…
类型对象负责创建对象实例,控制对象行为.那么类型对象又由谁来创建呢? 元类(metaclass)——类型的类型 New-Style Class的默认类型是type >>> class Data(object): ... pass ... >>> >>> Data.__class__ <type 'type'> >>> >>> type.__class__ <type 'type'> #最终的类…
非常详细的一篇深入讲解Python中metaclass的文章,感谢伯乐在线-bigship翻译及作者,转载收藏. 本文由 伯乐在线 - bigship 翻译.未经许可,禁止转载!英文出处:stackoverflow.欢迎加入翻译组. 译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及…
在python中对象.类型和元类构成了一个微妙的世界. 他们有在这个世界里和平共处,相辅相成.它们遵循着几条亘古不变的定律: 1.python中无处不对象 2.所有对象都有三种特性:id.类型.值 3.每个对象都是由其对应的类创建出来的 下面来逐条进行分析: 1.python中无处不对象 对象是python中对数据的一种抽象的表示.所有能够通过PyObject类型的指针访问的都是对象. python中的int.tuple.list.dict.set.函数.类以及派生类都是对象,当然类实例化的对象…
继承 继承的含义就是子类继承父类的命名空间,子类中可以调用父类的属性和方法,由于命名空间的查找方式,当子类中定义和父类同名属性或者方法时,子类的实例调用的是子类中的属性,而不是父类,这就形成了python中的多态: def SuperClass:    def a_method:        passdef SubClass(SuperClass):    def a_method:        passobj = SubClass()obj.a_method() 当obj调用一个方法时,先…
简单一句话,当一个类实现__call__方法时,这个类的实例就会变成可调用对象. 直接上测试代码 class ClassA: def __call__(self, *args, **kwargs): print('call ClassA instance') if __name__ == '__main__': # ClassA实现了__call__方法 a = ClassA() ''' 这个时候,ClassA的实例a,就变成可调用对象 调用a(),输出call ClassA instance,…
首先,需要知道两点: 类本身是type类的实例 __getattribute__ 可以改变类实例的属性的读取方式(http://www.cnblogs.com/blackmatrix/p/5681480.html) 对于__getattribute__,大部分例子都是类似这样的,通过重写类的__getattribute__方法,来改变这个类的实例的属性读取行为. class ClassA: x = 'a' def __init__(self): self.y = 'b' def __getatt…