python装饰器

python 25 类装饰器

我是研究僧i 提交于 2020-03-10 14:46:19
# python 类装饰器 # /usr/sbin/py/python # -*=coding:utf8-*- def dec(obj): obj.hobby = "singing" # 添加类属性 return obj # 加任意参数 def type(**kwargs): def deco(obj): for key,val in kwargs.items(): # obj.key = val setattr(obj,key,val) return obj return deco @type(school="实验小学",address="上海") # 分析 type方法返回值是deco方法 等价于 @deco 》》 Student = deco(Student) class Student: pass print(Student.__dict__) # 利用装饰器 实现参数类型限制 class Type: def __init__(self,key,parameterType): self.key = key self.parameterType = parameterType def __get__(self, instance, owner): return instance.__dict__[self.key] def __set__(self, instance,

《流畅的Python》(官方高清中文版PDF+高清英文版PDF+源代码)免费下载

纵饮孤独 提交于 2020-03-09 08:23:30
《流畅的Python》(官方高清中文版PDF+高清英文版PDF+源代码)免费下载 《流畅的Python》(官方高清中文版PDF+高清英文版PDF+源代码)免费下载 下载地址1: 网盘下载 下载地址2: 网盘下载 ,提取码:5nso 《流畅的Python》(官方高清中文版PDF+高清英文版PDF+源代码) 官方高清中文版PDF,632页,带目录书签,文字能够复制粘贴; 高清英文版PDF,766页,带目录书签,文字能够复制粘贴; 中文和英文两版对比学习。 配套源代码。 下载地址1: 网盘下载 下载地址2: 网盘下载 ,提取码:5nso 其中,高清中文版如图: 内容简介   本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。本书适合中高级Python软件开发人员阅读参考。 目录简介 第一部分 序幕   第 1 章 Python 数据模型 2 第二部分 数据结构   第 2 章 序列构成的数组 16   第 3 章 字典和集合 54   第 4 章 文本和字节序列 83 第三部分 把函数视作对象   第 5 章 一等函数 118   第 6 章 使用一等函数实现设计模式

python--装饰器

拈花ヽ惹草 提交于 2020-03-08 05:11:00
前戏 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原则: 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 实现装饰器知识储备   1.函数即'变量'   2.高阶函数 把一个函数当做实参传递给另外一个参数(在不修改被装饰函数源代码的情况下为其添加功能) 返回值中包含函数名(不修改函数的调用方式)   3.嵌套函数(在一个函数的函数体内用def声明另一个函数) 无参数的装饰器 下面有一个函数,如果我们想统计一下函数执行的时间,使用装饰器怎么实现呢 import time def test1(): time.sleep(2) print('in the test1') 如果不使用装饰器我们可以在之前前加一个时间,执行后加一个时间就可以了,如下 import time def test1(): start_time = time.time() time.sleep(2) print('in the test1') print(time.time()-start_time) test1() 但是这样的话,我们修改了源代码,如果这个函数有好多地方调用了,有些地方不希望要其他的功能,有些地方需要,难道我们需要重新写一个函数吗?在把调用到的地方都修改一下?如果你这样的话,明天就可以去财务领工资了。。。那来看看怎么使用装饰器来实现 1 import

DAY2-Python学习笔记

て烟熏妆下的殇ゞ 提交于 2020-03-08 03:36:35
1.迭代器: 可以直接作用于 for 循环的对象 统称 为 可迭代对象 : Iterable ,使用 isinstance() 判断一个对象是否是 Iterable 对象: >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False 可以被 next() 函数调用并 不断返回 下一个值的对象称为 迭代器 : Iterator ,使用 isinstance() 判断一个对象是否是 Iterator 对象: >>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator)

Python装饰器

百般思念 提交于 2020-03-07 06:59:38
现有如下函数: def fun1(): print('...fun1()...') def fun2(): print('...fun2()...') #调用函数 fun1() fun2() 需求:需要给以上两个函数添加记录日志功能 方法一:函数调用 def logging(): print('...logging...') def fun1(): print('...fun1()...') logging() def fun2(): print('...fun2()...') logging() #调用函数 fun1() fun2() 分析:上面这种方式适合少量函数调用,如果有n个地方需要调用logging()函数,那么得手动调用n次,比较麻烦,而且在fun1()中调用loggin()也相当于修改了fun1()的内容。 方法二:高阶函数(函数名作为参数传递给另一个函数) def logging(fun): fun() print('...logging...') def fun1(): print('...fun1()...') def fun2(): print('...fun2()...') #调用函数 logging(fun1) logging(fun2) 分析:该方法是高阶函数的用法,将函数名当做参数传递给另一个函数,优点是没有修改源代码,缺点是该方法修改了调用的方式。

python 装饰器

瘦欲@ 提交于 2020-03-07 06:59:01
之前学习编程语言大多也就是学的很浅很浅,基本上也是很少涉及到装饰器这些的类似的内容。总是觉得是一样很神奇的东西,舍不得学(嘿嘿)。今天看了一下书籍。发现道理还是很简单的。 简单的说:装饰器主要作用就是对函数进行一些修饰,它的出现是在引入类方法和静态方法的时候为了定义静态方法出现的。例如为了把foo()函数声明成一个静态函数 1 class Myclass(object):2 def staticfoo():3 ............4 ............ 5 staticfoo = staticmethod(staticfoo) 可以用装饰器的方法实现: 1 class Myclass(object):2   @staticmethod  3   def staticfoo():4     .........5     ......... 这个例子很明显很容易就可以看懂。 说到这里我们举一个下面的例子,这个例子里面同时涉及到一个重要内容,就是对于python中的函数的本质理解。 代码: 1 # -*- coding: utf-8 -*- 2 from time import ctime 3 from time import sleep 4 def ftfunc(func): 5 def timef(): 6 print "[%s] %s() called" % (ctime

python算术运算符重载、迭代器、call魔术方法和单例设计模式

风流意气都作罢 提交于 2020-03-07 03:41:42
1.算术运算符重载 我们知道在python中有字符串的相加、数字常量的相加,那么对于我们自定义的类实例化后的对象是否可以进行相加呢?答案是可以的。这里就要我们对于算术运算符进行重载。下面我们以__add__和__iadd__重载为例,讲解算术运算符的重载。 1.1.__add__ __add__是用来定义加法的魔术方法。 我们来看下面的例子, class Dog : def __init__ ( self , amount , name ) : self . amount = amount self . name = name def __add__ ( self , other ) : # 定义两个类相加的结果,other为其他类 return Dog ( self . amount + other . amount , self . name ) # 返回一个新类 d1 = Dog ( 23 , "Tom" ) d2 = Dog ( 21 , "Jerry" ) res = d1 + d2 # 等价于 d1.__add__(d2) 等价于 __add__(d1, d2) print ( res ) print ( res . amount ) print ( res . name ) print ( type ( res ) ) 执行结果如下, < __main__ . Dog

Python面向对象编程 - 4

断了今生、忘了曾经 提交于 2020-03-06 22:27:39
特殊成员和魔法方法 Python中有大量类似__doc__这种以双下划线开头和结尾的特殊成员及“魔法方法”,它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一! __init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__: 按照索引获取值 __len__: 获得长度 __cmp__: 比较运算 __call__: 调用 __add__: 加运算 __sub__: 减运算 __mul__: 乘运算 __div__: 除运算 __mod__: 求余运算 __pow__: 幂 1.__doc__ 说明性文档和信息。Python自建,无需自定义。 class Foo: """ 描述类信息,可被自动收集 """ def func(self): pass # 打印类的说明文档 print(Foo.__doc__) 2.__init__() 实例化方法,通过类创建实例时,自动触发执行。 class Foo: def __init__(self, name): self.name = name self.age = 18 obj = Foo(jack') # 自动执行类中的 __init__ 方法 3.__module__和__class__ _

[python学习篇][书籍学习][python standrad library][内建函数]之[all,any,basestring,isinstance,bin,bool,@classmethod,@staticmethod,cmp,enumerate

若如初见. 提交于 2020-03-06 04:41:10
Python 解释器内置了一些函数,它们总是可用的。 这里将它们按字母表顺序列出。 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() str() any() eval() isinstance() pow() sum() basestring() execfile() issubclass() print() super() bin() file() iter() property() tuple() bool() filter() len() range() type() bytearray() float() list() raw_input() unichr() callable() format() locals() reduce() unicode() chr() frozenset() long() reload() vars() classmethod() getattr() map() repr() xrange() cmp() globals() max() reversed() zip() compile() hasattr() memoryview() round() __import__() complex() hash(

python的重重之器(生成器、迭代器、装饰器)

Deadly 提交于 2020-03-06 02:55:34
一、装饰器 1、定义:本质是函数,装饰其他函数就是为其他函数添加附件功能。 2、原则:   a.不能修改被装饰的函数的源代码;   b.不能修改被装饰的函数的调用方式;  实例:   #!/usr/bin/env python  # -*- coding:utf-8 -*-  #Author:ye  import time  #装饰器  def time_cha(func):#func等于test   time_start = time.time()   func()#此时func()相当于test()   time.sleep(2)   time_stop = time.time()   print("the time cha is :%s" % (time_stop - time_start))  #主函数  def test():   print("*")   time.sleep(1)   print("*")   time.sleep(1)   print("in the test")  #单独调用主函数  test()  #将装饰器套用在主函数上  time_cha(test)#此方式改变了主函数的调用方式 3、实现装饰器的知识储备:   a.函数即“变量”   b.高阶函数     b1.把一个函数名当做实参传递给另外一个函数(在不修改被装饰函数的前提下,增加其功能)