python面向对象(六)之元类】的更多相关文章

一:知识储备 exec exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默认为locals() exec的应用: #可以把exec命令的执行当成是一个函数的执行,会将执行期间产生的名字存放于局部名称空间中 g={ 'x':1, 'y':2 } l={} exec(''' global x,z x=100 z=200 m=300 ''',g,l) print(g) #{'x': 100,…
关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一个type类,所有的类都是基于type类生成的,可谓万物之母. 如此广袤无垠的python生态圈,都是由type产生出来的. Python面向对象总计包含五大部分: 常用部分: 3.class(类,或者叫实例生成器) 4.instance(实例) 5.实例的各种属性与方法,我们平常使用python时…
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name) 当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下: >>> fro…
一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名字就是ObjectCreator.这个对象(类)自身拥有创建对象(类实例)的能力. 它的本质仍然是一个对象,于是乎你可以对它做如下的操作: 1)   你可以将它赋值给一个变量 2)   你可以拷贝它 3)   你可以为它增加属性 4)   你可以将它作为函数参数进行传递 >>> class…
元类是类的类,使我们自定义的类,即我们用class定义类本质就是元类,是类的模板 四步走: 一:控制class定义类的过程 1.先拿到类名 2.在拿到基类 3.执行类体代码,得到名称空间的dict 4.调用元类将三个参数传递进去 #其实class 是上面四步的封装.(隔离了复杂度) 二:自定义元类 class Mymeta(type): def __init__(self,class_name,class_base,class_dic): super().__init__(class_name,…
千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为 每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去? 在python世界,拥有一个永恒的道,那就是"type",请记在脑海中,type就是道.如此广袤无垠的python生态圈,都是由type产生出来的.在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学习Python的小伙伴们…
一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场.例如,某个服务器程序的配置信息存放在一个文件中,客户通过一个AppConfig的类来读取配置文件的信息.如果在程序运行期间,有很多地方需要使用配置文件的内容,也就是说,很多地方都需要创建AppConfig对象的实例,这就导致系统中存在多个AppConfig的实例对象,而这样会严重浪费内存资源,…
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self,name='world'): print('Hello,%s.' %name) 当Python解释器载入hello模块时,就会一次执行该模块的所有语句,,执行结果就是动态创建出一个Hello的class对象,测试如下: h = Hello() h…
千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住.因为每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去? 在python世界,拥有一个永恒的道,那就是“type”,请记在脑海中,type就是道.如此广袤无垠的python生态圈,都是由type产生出来的. 道生一,一生二,二生三,三生万物. 道 即是 type 一 即是 metaclass(元类,或者叫类生成器) 二 即是 class…
千万不要被所谓“元类是99%的python程序员不会用到的特性”这类的说辞吓住.因为每个中国人,都是天生的元类使用者 学懂元类,你只需要知道两句话: 道生一,一生二,二生三,三生万物 我是谁?我从哪来里?我要到哪里去? 在python世界,拥有一个永恒的道,那就是“type”,请记在脑海中,type就是道.如此广袤无垠的python生态圈,都是由type产生出来的. 道生一,一生二,二生三,三生万物. 道 即是 type 一 即是 metaclass(元类,或者叫类生成器) 二 即是 class…
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第18篇文章,我们来继续聊聊Python当中的元类. 在上上篇文章当中我们介绍了type元类的用法,在上一篇文章当中我们介绍了__new__函数与__init__函数的区别,以及它在一些设计模式当中的运用.这篇文章我们来看看metacalss与元类,以及__new__函数在元类当中的使用. 上一篇文章非常重要,是这一篇的基础,如果错过了上篇文章,推荐回顾一下: Python面试常见问题,__init__是构造函数吗…
# -*- 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中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作且仅仅只在类定义阶段发生变形 #类中所有双下划线开头的名称如__x都会在类定义时自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设…
系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多人只知道使用继承的表面形式来创建一个类,却不知道其内部真正的创建是由type来创建的. type?这不是判断对象类型的函数吗? 是的,type通常用法就是用来判断对象的类型.但除此之外,他最大的用途是用来动态创建类.当Python扫描到class的语法的时候,就会调用type函数进行类的创建. .…
########################总结################ 面向对象回顾 类:对某一个事物的描述,对一些属性和方法的归类 class 类名: var=123#类变量 def __init__(self,x,x,x)#实例变量 self.xxx=xxx self.xxx=xxx self.xxx=xxx #实例方法:给对象用的 def method(self): pass @staticmethod():--函数 def stsmethod(): pass @classm…
python元类:type()    元类是python高阶语法. 合理的使用可以减少大量重复性的代码. 元类实际上做了以下三方面的工作: 干涉创建类的过程 修改类 返回修改之后的类 为什么使用元类? 为什么要使用元类这种模糊且容易出错的功能?一般情况下,我们并不会使用元类,99%的开发者并不会用到元类,所以一般不用考虑这个问题.元类主用用于创建API,一个典型的例子就是Django的ORM.它让我们可以这样定义一个类: class Person(models.Model): name = mo…
内容目录: 一.元类 二.单例模式 一.元类 1 什么是元类: 源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的 class OldboyTeacher: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def score(self): print('%s is scoring' %self.name) # tea1=OldboyTeacher('egon',18,'male'…
元类(MetaClasses) 元类提供了一个改变Python类行为的有效方式. 元类的定义是“一个类的类”.任何实例是它自己的类都是元类. class demo(object): pass obj = demo() print "Class of obj is {0}".format(obj.__class__) print "Class of obj is {0}".format(demo.__class__) # Class of obj is <cla…
1.type()函数 if __name__ == '__main__': h = hello() h.hello() print(type(hello)) print(type(h)) Hello, world. <class 'type'> <class '__main__.Hello'> 2.metaclass元类 #metaclass 元类 metaclass允许你创建类或者修改类 class Listmetaclass(type): def __new__(cls, na…
“元类的魔幻变化比 99% 的用户所担心的更多,当你搞不懂是否真的需要用它的时候,就是不需要.” —Tim Peters 本文源于在 PyCon UK 2008 上的一个快速演讲. 元类被称为 Python 中的“深奥的巫术”.尽管你需要用到它的地方极少(除非你基于zope 编程),可事实上它的基础理论其实令人惊讶地易懂. 一切皆对象 一切皆对象 一切都有类型 “class”和“type”之间本质上并无不同 类也是对象 它们的类型是 type 以前,术语 type 用于内置类型,而术语 clas…
所学内容 异常处理(常用) AttributeError ··························  试图访问一个对象没有的树形,比如foo.x,但是foo没有属性xIOError ·······································  输入/输出异常:基本上是无法打开文件ImportErro ································· 无法引入模块或包:基本上是路径问题或名称错误IndentationError ··········…
元类 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919344c4ef8b1e04c48778bb45796e0335839000 1)type() 结论:动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的.正常情况下,我们都用 class Xxx... 来定义类,但是, type() 函数也允许我们动态创…
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性.   抽象类是介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计.在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基…
引子:类的对象在内存中的表示def dog(name,dog_type): def bark(d): print(d,'wang wang wang ...') data = { 'name':name, 'type':dog_type 'bark':bark }调用方法:d1 = dog('小哈','哈士奇')d1['bark'](d1) 可以阻止不同类型角色的方法混用但是同类角色也有不同的地方,这时候快速开发等等需要引入面向对象的概念对象间复杂的关系描述,有相同点也有不同点.需要面向对象的思…
反射:reflect,反射指的是一个对象应该具备可以检测.修改.增加自身属性的能力,反射就是通过字符串操作属性 hasattr(对象,带查询的属性名称) 判断某个对象中是否存在某个属性 getattr 从指定对象中取出属性,第三个参数为默认值,当参数不存在时返回的就是默认值 setattr 为对象添加新的属性 delattr 从对象中删除属性 使用场景: 反射其实就是对属性的增删改查,但是如果直接用dict来操作的话,语法繁琐,而且不是很好理解,另外一个主要的问题是,如果对象不是我自己写的是另一…
一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. >>> class Student(object): ... def __init__(self, name): ... self.name = name # 每个实例必须的属性 ... >>> s = Student('Jack') >>> s.score = 90 # 任意绑定属性 >>> s.name 'Jack' >>> s.score…
1.C#.Java :只能用面向对象编程 Ruby.Python :函数编程+ 面向对象 面向对象编程不是在所有地方都比函数式编程方便的,类是为了封装,下面是简单的使用方法 在创建类的时候要用class再加上一个类名,然后加上方法,调用类里面的方法必须先实例化一个类,然后使用事例去执行类里面的方法. 每次实例化的时候其实都是如图上一样,先在内存里面开辟一块空间,然后这个实例有一个类内存指针,告诉自己是由那个类创建的 2.在执行类的方法的时候,Python内部会将实例会作为self参数传进去,如下…
Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类. 比如: __str__ 与__repr____iter____getitem____call__ __str__ 与__repr__ class Student(object): def __init__(self,name): self.name = name ''' 只有以上的话, print(Student('kumata')) 输出结果:<__main__.Student object at 0x109afb1…
组合 组合举例组合就是多个类,或者若干类联合起来完成一个任务下面举例两个类联合起来完成一个任务为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类最好能动态实例化类并传参(依赖注入),后面讲到 组合举例# 组合就是多个类,或者若干类联合起来完成一个任务# 下面举例两个类联合起来完成一个任务# 为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实…
一.动态添加属性 >>> class Student(object): pass >>> st = Student() >>> st.name = 'Jack' >>> st.name 'Jack' 二.动态给实例添加方法 >>> from types import MethodType >>> class Student(object): pass >>> def set_age…