zoukankan      html  css  js  c++  java
  • Python 学习 —— 进阶篇(装饰器、类的特殊方法)

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

    def log(f):
        def fn(x):
            print 'call ' + f.__name__ + '()...'
            return f(x)
        return fn
    
    print '------------ 直接调  ----------- '
    g = log(int)
    g('10010')                      # 只调不打印返回值
    print ''
    print g('10010')                # 又调又打印输出结果
    
    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 '
    ------------ special called -------------'
    John.gender = 'male'
    print 'changed: ' , John # 没打印出来新属性gender,因为自定义的__str__方法中没有
    print John.gender        # 确实给John添加了新属性
    John(Alice)
    
    print '
    ------------ instance sort --------------'
    L = [John,Alice]
    print sorted(L)
    
    print '
    ------- print a sorted list -----------'
    mylist = [Student('Alice',85),Student('Bob',90),Student('Tom',100)]
    print sorted(mylist)
  • 相关阅读:
    桃李春风一杯酒,江湖夜雨十年灯
    实现.net下的动态代理(续)多对象Mixin
    队列不存在,或您没有足够的权限执行该操作另一种原因
    .NET托管内存类应用的内存泄漏分析和诊断(转)
    移动硬盘 执行页内操作时的错误修复方法
    阮一峰:四位计算机的原理及其实现
    一款mvvm框架运用介绍(转)
    C#制作CAB压缩包压缩解压类
    ASP.NET C# 向 ACCESS 插入日期型数据 标准表达式中数据类型不匹配
    SQL Server日志清除的两种方法
  • 原文地址:https://www.cnblogs.com/binye-typing/p/6085675.html
Copyright © 2011-2022 走看看