Python 学习 —— 进阶篇(装饰器、类的特殊方法)
Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例:
def log(f):
def fn(x):
print 'call ' + f.__name__ + '()...'
return f(x)
return fn print '------------ 直接调 ----------- '
g = log(int)
g('') # 只调不打印返回值
print ''
print g('') # 又调又打印输出结果 print '------------ 装饰器 ----------- '
@log
def myabs(x):
if x < 0:
return -x
else:
return x
print myabs(-17) # 下面是错误的装饰器调用
# @log
# def add(x,y):
# return x + y
# print add(4,8) print '----------- 修改装饰器以支持多参数 -----------'
def log2(f):
def fn(*args,**kv):
print 'call ' + f.__name__ + '()...'
return f(*args,**kv)
return fn
@log2
def add(x,y):
return x + y
print add(4,8) print '-------------------- 带参的装饰器 ------------------------'
def log3(prefix):
def log_decorator(f):
def fn(*args,**kv):
print '[%s] %s()...' % (prefix,f.__name__)
return f(*args,**kv)
return fn
return log_decorator print '---- 普通调用 -----'
def division(x,y):
return x/y
log_decorator = log3('DEBUG')
division = log_decorator(division)
print division(18, 6) print '---- 装饰器调用 ----'
@log3('DEBUG')
def multiplication(a,b):
return a * b
print multiplication(3, 4)
下面针对Python类中几个常见的特殊方法重写:
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
def __str__(self):
return '(Student: %s, %s)' % (self.name,self.score)
def __cmp__(self,s):
if self.name < s.name:
return -1
elif self.name > s.name:
return 1
else:
return 0
def __call__(self,friend):
print 'My name is %s...' % self.name
print 'My friend is %s...' % friend.name print '------- basic info output ------------'
John = Student('John',99)
Alice = Student('Alice',85)
print John
print Alice print '\n------------ special called -------------'
John.gender = 'male'
print 'changed: ' , John # 没打印出来新属性gender,因为自定义的__str__方法中没有
print John.gender # 确实给John添加了新属性
John(Alice) print '\n------------ instance sort --------------'
L = [John,Alice]
print sorted(L) print '\n------- print a sorted list -----------'
mylist = [Student('Alice',85),Student('Bob',90),Student('Tom',100)]
print sorted(mylist)
Python 学习 —— 进阶篇(装饰器、类的特殊方法)的更多相关文章
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)
1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- python学习之类的装饰器进阶版
装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func): print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- Python学习系列之装饰器
装饰器的作用 装饰器用于装饰某个函数.方法或者类,它可以让这个函数执行之前或者执行之后做一些操作 手工实现一个装饰器 def outer(some_func): #装饰器 $1 def inner() ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
随机推荐
- 运行 jar 的问题
lib stwe.jar 同目录
- TreeMap核心源码实现解析
TreeMap实现了SotredMap接口,它是有序的集合.而且是一个红黑树结构,每个key-value都作为一个红黑树的节点.如果在调用TreeMap的构造函数时没有指定比较器,则根据key执行自然 ...
- 4.闭锁 CountDownLatch
/*CountDownLatch 闭锁*/ CountDownLatch 是一各同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 闭锁可以延迟线程的进度 直到 其到达终 ...
- Axure工作区间
Axure的工作环境可进行可视化拖拉操作,可轻松快速的创建带有注释的线框图.无需编程就可以在线框图中定义简单链接和高级交互.Axure可一体化生成线框图.HTML交互原型.规格说明Word文档.以下是 ...
- PAT Baisc 1079 延迟的回文数 (20 分)
给定一个 k+1 位的正整数 N,写成 ak⋯a1a0 的形式,其中对所有 i 有 0 且 ak>0.N 被称为一个回文数,当且仅当对所有 i 有 ai=ak−i ...
- The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online - H Traveling on the Axis-【思维模拟题目】
H Traveling on the Axis 作者: 浙江大学竞赛命题组 单位: ACMICPC 时间限制: 500 ms 内存限制: 64 MB 代码长度限制: 32 KB 传送门 BaoBao ...
- bat 判断 bat 是否是以管理员权限运行,和自动以管理员权限运行
bat 判断 bat 是否是以管理员权限运行,和自动以管理员权限运行 判断 @echo off net.exe session 1>NUL 2>NUL && ( goto ...
- Android-File读写+SharedPreferences的存取地址
写了两个demo,一个是使用SharedPreferences将数据存储在应用文件中并读取,另一个是使用Context的openFileOutput和openFileInput将数据存储在应用文件中并 ...
- 24-SQLServer存储空间的分配和使用情况
一.总结 1.SQLServer中的数据库有的时候会有多个数据文件组或者多个数据文件的情况,该博客就是讨论当有多个数据文件时,表的数据会怎么存储,存储在哪些数据文件中. 2.首先SQLServer中的 ...
- JAVA开发WEBSERVICE方式
webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...