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 学习 —— 进阶篇(装饰器、类的特殊方法)的更多相关文章

  1. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  2. day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)

    1. 装饰器 / 类中的方法 / 类的方法变属性 # ### 装饰器 """ 定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数 优点:在不更改原函数代码的 ...

  3. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  4. python学习之类的装饰器进阶版

    装饰器可以修饰函数,同样,也可以修饰类 装饰器 def deco(func):    print('======>被修饰的')return func 装饰器装饰函数的方式,语法糖 @decode ...

  5. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  6. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  7. Python学习系列之装饰器

    装饰器的作用 装饰器用于装饰某个函数.方法或者类,它可以让这个函数执行之前或者执行之后做一些操作 手工实现一个装饰器 def outer(some_func): #装饰器 $1 def inner() ...

  8. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  9. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

随机推荐

  1. ASE —— 第一次结对作业

    问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...

  2. linux cenos开放端口

    问题:8080端口不能访问 解决方案: 第1步 查看阿里云端口是否开放 网络安全>安全组>配置规则>添加入方向 第二步 查看防火墙是否开启(只说开启了防火墙的情况) 查看防火墙状态: ...

  3. java - day009 - 基础API,object,String, StringBuilder/StringBuffer, 正则表达式

    API java.lang.object object 所有类的顶层父类 一个类如果不继承其他类,默认继承object.    toString() 获得一个对象的字符串表示     可以重写     ...

  4. 通用mapper的增删改查方法 留存 备忘

    Mybatis通用Mapper介绍与使用   前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...

  5. STM32 ID (转)

    STM32唯一ID(Unique Device ID)的读取方法 (转)   每一个STM32微控制器都自带一个96位的唯一ID,也就是Unique Device ID或称为UID,这个唯一ID在任何 ...

  6. jade安全转义和非转义

      - var data = 'text' - var htmlData = ')</script><span>script</span>' 例如上面的例子,假如没 ...

  7. pyqt pyside qcombobox disable wheel scrolling

    pyqt pyside qcombobox disable wheel scrolling import sys from PyQt5 import QtCore, QtWidgets import ...

  8. IP分组

    IP 分组为了更准确地讨论 I n t e r n e t协议处理,我们必须定义一些名词.图 显示了在不同的I n t e r n e t层之间传递数据时用来描述数据的名词.我们把传输协议交给 I P ...

  9. java第八次作业-继承

    一.题目 编写一个应用程序,创建一个矩形类,类中具有长.宽两个成员变量和求周长的方法.再创建一个矩形类的子类------正方形类,类中定义求面积的方法.重写求周长的方法.在主类中,输入一个正方形边长, ...

  10. Python 8--异常