关于元类,我写过一篇,如果你只是了解元类,看下面这一篇就足够了. Python面向对象之类的方法和属性 本篇是深度解剖,如果你觉得元类用不到,呵呵,那是因为你不了解Django. 在Python中有一个type类,所有的类都是基于type类生成的,可谓万物之母. 如此广袤无垠的python生态圈,都是由type产生出来的. Python面向对象总计包含五大部分: 常用部分: 3.class(类,或者叫实例生成器) 4.instance(实例) 5.实例的各种属性与方法,我们平常使用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,…
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的小伙伴们…
python元类:type()    元类是python高阶语法. 合理的使用可以减少大量重复性的代码. 元类实际上做了以下三方面的工作: 干涉创建类的过程 修改类 返回修改之后的类 为什么使用元类? 为什么要使用元类这种模糊且容易出错的功能?一般情况下,我们并不会使用元类,99%的开发者并不会用到元类,所以一般不用考虑这个问题.元类主用用于创建API,一个典型的例子就是Django的ORM.它让我们可以这样定义一个类: class Person(models.Model): name = mo…
一.单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在. 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场.例如,某个服务器程序的配置信息存放在一个文件中,客户通过一个AppConfig的类来读取配置文件的信息.如果在程序运行期间,有很多地方需要使用配置文件的内容,也就是说,很多地方都需要创建AppConfig对象的实例,这就导致系统中存在多个AppConfig的实例对象,而这样会严重浪费内存资源,…
本文节选自<Spring 5核心原理> 阅读本文之前,请先阅读以下内容: 30个类手写Spring核心原理之自定义ORM(上)(6) 30个类手写Spring核心原理之自定义ORM(下)(7) 4 动态数据源切换的底层原理 这里简单介绍一下AbstractRoutingDataSource的基本原理.实现数据源切换的功能就是自定义一个类扩展AbstractRoutingDataSource抽象类,其实相当于数据源的路由中介,可以实现在项目运行时根据相应key值切换到对应的DataSource上…
千万不要被所谓“元类是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__是构造函数吗…
系列文章 √第一章 元类编程,已完成 ; 本文目录 类是如何产生的如何使用type创建类理解什么是元类使用元类的意义元类实战:ORM . 类是如何产生的 类是如何产生?这个问题肯定很傻.实则不然,很多人只知道使用继承的表面形式来创建一个类,却不知道其内部真正的创建是由type来创建的. type?这不是判断对象类型的函数吗? 是的,type通常用法就是用来判断对象的类型.但除此之外,他最大的用途是用来动态创建类.当Python扫描到class的语法的时候,就会调用type函数进行类的创建. .…
type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello.py模块: class Hello(object): def hello(self,name='world'): print('Hello,%s.' %name) 当Python解释器载入hello模块时,就会一次执行该模块的所有语句,,执行结果就是动态创建出一个Hello的class对象,测试如下: h = Hello() h…
元类 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319106919344c4ef8b1e04c48778bb45796e0335839000 1)type() 结论:动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的.正常情况下,我们都用 class Xxx... 来定义类,但是, type() 函数也允许我们动态创…
# -*- 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 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设…
内容目录: 一.元类 二.单例模式 一.元类 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 ··········…
一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性.   抽象类是介于类和接口之间的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计.在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来操作的话,语法繁琐,而且不是很好理解,另外一个主要的问题是,如果对象不是我自己写的是另一…
本文节选自<Spring 5核心原理> 1 实现思路概述 1.1 从ResultSet说起 说到ResultSet,有Java开发经验的"小伙伴"自然最熟悉不过了,不过我相信对于大多数人来说也算是"最熟悉的陌生人".从ResultSet取值操作大家都会,比如: private static List<Member> select(String sql) { List<Member> result = new ArrayList&l…
本文将通过模拟Mybatis动态代理生成Mapper代理类,讲解Mybatis原理 1.平常我们是如何使用Mapper的 先写一个简单的UserMapper,它包含一个全表查询的方法,代码如下 public interface UserMapper { @Select("select * from user") public List<User> queryAll(); } 然后大家思考一个问题,我们平时是怎么使用这个UserMapper的? 很多时候我们会把Mybatis…
本文节选自<Spring 5核心原理> 1 IDEA集成Lombok插件 1.1 安装插件 IntelliJ IDEA是一款非常优秀的集成开发工具,功能强大,而且插件众多.Lombok是开源的代码生成库,是一款非常实用的小工具,我们在编辑实体类时可以通过Lombok注解减少getter.setter等方法的编写,在更改实体类时只需要修改属性即可,减少了很多重复代码的编写工作. 首先需要安装IntelliJ IDEA中的Lombok插件,打开IntelliJ IDEA后单击菜单栏中的File→S…
本文节选自<Spring 5核心原理> 1 Annotation(自定义配置)模块 Annotation的代码实现我们还是沿用Mini版本的,保持不变,复制过来便可. 1.1 @GPService @GPService代码如下: package com.tom.spring.formework.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import j…
本文节选自<Spring 5核心原理> 在之前的源码分析中我们已经了解到,依赖注入(DI)的入口是getBean()方法,前面的IoC手写部分基本流程已通.先在GPApplicationContext中定义好IoC容器,然后将GPBeanWrapper对象保存到Map中.在GPApplicationContext中设计两个Map:factoryBeanObjectCache保存单例对象的缓存,factoryBeanInstanceCache保存GPBeanWrapper的缓存,变量命名也和原生…