博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 学习 —— 进阶篇(装饰器、类的特殊方法)
阅读量:6263 次
发布时间:2019-06-22

本文共 2301 字,大约阅读时间需要 7 分钟。

  Python基础部分学完之后,在进入其OOP部分前,先理解一下其装饰器这种结构,其功能可类比于Java中的面向切面编程,下面参见具体实例:

def log(f):    def fn(x):        print 'call ' + f.__name__ + '()...'        return f(x)    return fnprint '------------ 直接调  ----------- 'g = log(int)g('10010')                      # 只调不打印返回值print ''print g('10010')                # 又调又打印输出结果print '------------ 装饰器  ----------- '@logdef myabs(x):     if x < 0:        return -x    else:        return xprint 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@log2def add(x,y):    return x + yprint 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_decoratorprint '---- 普通调用 -----'def division(x,y):    return x/ylog_decorator = log3('DEBUG')division = log_decorator(division)print division(18, 6)print '---- 装饰器调用 ----'@log3('DEBUG')def multiplication(a,b):    return a * bprint 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 Johnprint Aliceprint '\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)

 

转载于:https://www.cnblogs.com/binye-typing/p/6085675.html

你可能感兴趣的文章
容易犯错的面试题
查看>>
django框架 restful规范 CBV源码分析
查看>>
jdk 配置(已验证,但是并不是完全相同)
查看>>
《代码敲不队》第九次团队作业:Beta冲刺与验收准备
查看>>
迭代器和生成器
查看>>
requests库入门05-参数类型
查看>>
go语言 windows 32位编译环境搭建
查看>>
我的家庭私有云计划-20
查看>>
手把手教你封装属于自己的Windows7安装镜像
查看>>
《作业指导书》的发布管理问题与解决办法
查看>>
55.Azure内容分发网络(CDN)
查看>>
MySQL常见错误代码(error code)及代码说明
查看>>
微软MVP社区巡讲
查看>>
总结一下,MariaDB 10(MySQL5.6企业版分支)的主要新特性
查看>>
MS UC 2013-0-虚拟机-标准化-部署-2-模板机-制作-3-安装-Tool
查看>>
IDS与IPS的区别
查看>>
初试Windows 8 RTM
查看>>
Linux 下rpm包搭建LAMP环境
查看>>
Windows Server 2016-Nano Server介绍
查看>>
未来架构师的平台战略范例(4)_大数据
查看>>