python高级编程
介绍python编程的奇淫巧技
JaysenLeo
挖粪涂墙,星辰大海
展开
-
(一)python 设计模式 --- 六大原则
单一职责原则,一个类或者模块应该有且只有一个改变的原因,例如,搓衣板,既可以用来跪,也可以用来洗衣服。而在单一职责原理下,搓衣板的两个功能就是引起这个类变化的两个原因,就应该写成两个类# -*- coding: utf-8 -*-"""单一职责原则"""class Person(o原创 2018-07-24 11:34:02 · 1801 阅读 · 0 评论 -
(二)python 设计模式 --- 简单工厂
文件目录 DesignPattern\SimpleFactory.py# -*- coding: utf-8 -*-"""非简单工厂 要记住住各种调用接口,子类的名字都要记住,直接实例化子类"""class Shape(object): passclass Triangle(Shape): def dra原创 2018-07-02 23:47:41 · 332 阅读 · 0 评论 -
(三)python 设计模式 --- 策略模式
1. 根据需求,通过实现模板接口对象,将其注入实现策略模式# -*- coding: utf-8 -*-####################### 策略模式 模板接口 #######################class TravelStrategy(object): ''' 出行策略 ''' def travelAlgorithm(...原创 2018-07-02 23:46:38 · 852 阅读 · 0 评论 -
(四)python 设计模式 --- 模板模式
将调用接口统一化,从而定义一个算法的骨架,即定义元方法集,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,也就是说,在父类中定义一个完成该事情的总方法。每个步骤的具体实现,由子类完成,之后子类再按照完成事件需要去调用其每个步骤的实现方法。# -*- coding: utf-8 -*-class Register(object): ...原创 2018-07-03 00:00:29 · 394 阅读 · 0 评论 -
(五)python 设计模式 --- 建造者模式
相关模式:思路和模板方法模式很像,模板方法是封装算法流程,对某些细节,提供接口由子类修改,建造者模式更为高层一点,将所有细节都交由子类实现。也就是说,将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示(例如 J20 与 歼 J10机体不一样,引擎不一样)。 基本思路 某类产品的构建由很多复杂组件组成; 这些组件中的某些细节不同,构建出的产品表象会略有不...原创 2018-07-03 00:25:31 · 390 阅读 · 0 评论 -
(六)python 设计模式 --- 迭代器模式
访问一个数据容器的内容而无需暴露它的内部表示,支持对该数据容器的多种遍历# -*- coding: utf-8 -*-def count_to(count): # 1.内部以列表形式存储 该数据 _numbers = ["one", "two", "three", "four", "five"] # 2.内部以 IO形式 及时请求数据 _numbers...原创 2018-07-03 00:35:27 · 606 阅读 · 0 评论 -
(七)python 设计模式 --- 单例模式
# -*- coding: utf-8 -*-class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): print('create new') cls._instance = super(Si...原创 2019-01-28 20:24:29 · 242 阅读 · 0 评论 -
(八)python 设计模式 --- 代理模式
定义为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。著名的代理模式例子为引用计数(英语:reference counting)指针对象。当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对...原创 2019-01-28 20:23:28 · 314 阅读 · 0 评论 -
(九)python 设计模式 --- 亨元模式
背景一个对象的创建,玩玩伴随着一定的开销,性能问题也将不得不面对。一个大型复杂系统,当需要创建大量的同时段并存的对象时,资源受限将是个问题。因为从理论上讲,当我们创建一个对象时,往往需要分配额外的内存,虽然现在的操作系统对内存的管理大都是基于虚拟内存的理论,理论上有超出硬件内存容量的内存空间。但实际一个系统如果耗尽了所有的物理内存,就会开始将内存页替换到二级存储设备,往往是硬盘,这个样的...原创 2020-05-02 18:16:24 · 343 阅读 · 0 评论 -
(十)python 设计模式 --- 适配器模式
背景当我们把异构组件用于另一个系统中,不对代码进行任何修改的仍然能进行通信的情况很少见。但又并非总是能修改该组件代码。如果是外部提供的组件,修改代码也不切实际。此时我们可以编写一个额外的代码层,该代码层让异构组件接口和调用端结构能够通信。适配器模式(Adapter pattern) 结构性设计模式,帮助我们实现不兼容接口之间的兼容原则不要求访问他方接口的源代码不违反开放/封...原创 2020-05-02 23:08:08 · 386 阅读 · 0 评论 -
Python拾遗之迭代器和生成器(一)
迭代器与生成器(一) 环境:Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:40:30) [MSC v.1500 64 bit (AMD64)] on win32关于迭代器 迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。原创 2017-05-04 15:49:31 · 536 阅读 · 0 评论 -
Python拾遗之迭代器和生成器(二)
迭代器与生成器(二)关于生成器(在Python中) 生成器可以称为特殊的迭代器,因为它具有可迭代的属性,也具备next方法,而它的特殊之处在于其具有协同程序的概念,从语法上讲,生成器是一个带yield语句的函数,从而保证生成器能暂停执行,返回中间的结果(这也是yield语句的功能,即返回一个只给调用者并暂停执行),当生成器的next方法被再次调用时,它会准确的从离开的地方继续执行。例如,通过列表原创 2017-05-04 16:05:52 · 390 阅读 · 0 评论 -
Python拾遗之类属性和实例属性(一)
关于类属性和实例属性(一) 深入理解类属性和实例属性: 下面的实例中,类Foo1在创建时,带了类属性Foo1_value,通过类对象可以访问它,例如Foo1.Foo1_value,当实例foo1被创建后,对实例foo1而言,它并没有在类里定义实例属性,所以访问会失败。python解释器会首先实例的内存空间里搜索Foo1_value,由于本身没有定义,所以没有,(此处脑补实例的类图关系),实例的原创 2017-05-06 22:39:26 · 629 阅读 · 0 评论 -
Python拾遗之类属性和实例属性(二)
关于类属性和实例属性(二) 关于类的属性访问和调用规则 类的属性,这里所指的属性包括方法和数据,从访问权限上分,分为公有,私有两种先说说私有属性,一种是单下划线开头的,模块级别的私有,在不同包之间以from module import 形式导入的模块,该模块里的单下划线私有属性都不会在导入的模块被成功访问到,而导入的是同一个包下面的模块,恰恰相反,只有from module import ,才在原创 2017-05-06 22:48:56 · 472 阅读 · 0 评论 -
Python拾遗之特殊函数 __getitem__
# -*- coding:utf-8 -*-""" 若类Address中定义了__getitem__()方法, 那么它的实例对象 addr 就可以这样addr[key]取值。 此时就会调用实例中的 __getitem__() 方法, 利用该方法可以实现定制切片"""class Address: def __init__(self, ip, po..原创 2018-09-03 22:10:23 · 782 阅读 · 0 评论 -
Python拾遗之特殊函数 __len__
# -*- coding: utf-8 -*-"""如果一个类或者其实例对象有类似list对象一样的通过 len() 函数来 获取对象的统计属性的值即 该对象可统计元素的个数。此时,类必须提供一个特殊方法__len__(),在这个方法下定义返回元素的个数,也就是说,只要正确实现了__len__()方法,就可以用len()返回如下 Family实例“长度”"""class Fam...原创 2018-07-05 19:57:48 · 524 阅读 · 0 评论 -
Python拾遗之特殊函数 __call__
python 中 一切即对象,不外乎函数>>> func = len>>> func.__name__'len'>>> func('asdf')4 所有函数都是可调用的对象,在类实例也可以变成一个可调用的对象只需实现一个特殊方法 _ call_() class Job(object): de...原创 2018-07-05 20:34:21 · 398 阅读 · 0 评论 -
Python拾遗之特殊函数 __enter__ 和__exit__
上下文管理器 (context manager) 是Python2.5开始支持的一种语法,用于规定某个对象(往往是类实例对象)的使用范围。一旦进入或者离开,这会触发相应的生命钩子(enter 和exit)函数,在钩子函数中可以定义,特殊操作例如,对象分配或者释放内存。调用构建有钩子函数的类实例时,往往依赖形式为with…as…的语法。with open("file.txt", "w")...原创 2018-07-06 00:53:03 · 1692 阅读 · 0 评论 -
Python拾遗之特殊函数 __dict__
class 通过内置成员dict 存储成员信息(字典),当类实例成员属性发生变动时,会调用 _ setattr _ ,在这个方法下进行属性的必须进行赋值操作 self._ dict_ [name] = value。若不进行定义 ,如下的self.name = obj[‘name’]语句将无任何意义,若在class中未显式定义 _ setattr __,解释器会默认执行该赋值语句。cl...原创 2018-07-10 20:05:09 · 456 阅读 · 0 评论 -
Python拾遗之特殊函数 __del__
当删除最后一个对象时,python解释器会默认调用一个方法,这个方法为_ del ()方法。在python中,很少会直接销毁对象,如果需要,一般使用del关键字销毁。Python的内存管理机制能够很好的胜任这份工作。不管是手动调用del还是由python自动回收都会触发 del _方法执行# -*- coding: utf-8 -*-import sysclass Test(...原创 2018-07-12 22:12:10 · 449 阅读 · 0 评论 -
Python雾里看花-链式调用
# -*- coding: utf-8 -*-class SuperTupl(tuple): def to_lis(self): return list(self) def to_dic(self, set_key=0): a = {str(val[set_key]): val for val in self} return...原创 2019-07-27 22:37:32 · 303 阅读 · 0 评论 -
Python雾里看花-抽象类ABC (abstract base class)
首先认识模块 abc,python中没有提供抽象类与抽象方法,然而提供了内置模块abc来模拟实现抽象类,例如提供泛映射类型的抽象类 abc.MutableMapping继承abc.MutableMapping构造一个泛映射类型(类似python中的dict)# -*- coding: utf-8 -*-from collections import abcclass M...原创 2018-09-03 22:09:40 · 2339 阅读 · 0 评论 -
Python雾里看花-帅气的进度条
# -*- coding: utf-8 -*-import sysimport timeclass StdoutColors(object): """格式:\033[显示方式;前景色;背景色m 说明: 前景色 背景色 颜色 --------------------------------------- 3...原创 2018-07-12 22:45:31 · 524 阅读 · 0 评论 -
Python雾里看花-动态倒入模块之importlib
文件目录 main.pyimport sys# 获取模块或者服务名称service = 'Login'_router = 'Service.' + str(service)if _router in sys.modules: router = importlib.reload(_router)else: router = impo...原创 2018-07-12 23:13:18 · 334 阅读 · 0 评论 -
Python雾里看花-list与set十万数据查询性能对比
# -*- coding: utf-8 -*-import randomimport timenum = 100000listA = [random.randint(1, i) for i in range(1, num)]setB = set()while len(setB) < len(listA): setB.add(random.randint(1, num)...原创 2018-07-24 11:25:46 · 898 阅读 · 0 评论