【飞桨/百度领航团/零基础Python】百度飞桨领航团零基础Python速成营笔记-05

文章目录

  • 一、装饰器
    • 1.1、将函数名赋值给变量
    • 1.2、在函数中定义函数
    • 1.3、将函数作为参数进行传递
    • 1.4、函数作为函数的返回值
    • 1.5、装饰器写法
    • 1.6、装饰器实际使用例子
  • 二、python面向对象(下)
    • 2.1继承
    • 2.2、多继承
    • 2.3、方法重写
    • 2.4、多态性
    • 2.5、模块导入

一、装饰器

1.1、将函数名赋值给变量

  • 例子

    def say():
        print('我们唠10块钱的')
    
    isayhello = say
    isayhello()
    '''
    我们唠10块钱的
    '''
    

1.2、在函数中定义函数

  • 例子

    def say():
        def sayHello():
            print('你好啊')
        def sayBye():
            print('再见')
        sayHello()
        print('我们唠10块钱的')
        sayBye()
    
    say()
    '''
    你好啊
    我们唠10块钱的
    再见
    '''
    

1.3、将函数作为参数进行传递

  • 例子

    def say(conv):
        def sayHello():
            print('你好啊')
        def sayBye():
            print('再见')
        sayHello()
        conv()
        sayBye()
    
    def conv1():
        print('唠5块钱的')
    def conv2():
        print('唠1个点呗')
        
    say(conv1)
    say(conv2)
    '''
    你好啊
    唠5块钱的
    再见
    你好啊
    唠1个点呗
    再见
    '''
    

1.4、函数作为函数的返回值

  • 例子

    def say(flag):
        def sayHello():
            print('你好啊')
        def sayBye():
            print('再见')
        if flag == 1:
            return sayHello
        return sayBye
    
    res1 = say(1)
    res1()
    '''
    你好啊
    '''
    

1.5、装饰器写法

  • 例子

    def say(conv):
        def sayHello():
            print('你好啊')
        def sayBye():
            print('再见')
        sayHello()
        conv()
        sayBye()
        return sayHello  #在19行conv1()执行
    
    
    @say
    def conv1():
        print('唠5块钱的')
    @say
    def conv2():
        print('唠1个点呗')
    
    conv1()
    '''
    你好啊
    唠5块钱的
    再见
    你好啊
    唠1个点呗
    再见
    你好啊
    '''
    

1.6、装饰器实际使用例子

  • 例子

    from functools import wraps
    #使用了装饰器
    def mylog(func):
        @wraps(func)
        def with_logging(*args):
            print(func.__name__+" was called")
            print(args)
            return func(*args)
        return with_logging
    
    @mylog
    def add(a,b):
        print(a+b)
    
    @mylog
    def mins(a,b):
        print(a-b)
    
    @mylog
    def mul(a,b):
        print(a*b)
    
    @mylog
    def div(a,b):
        print(a/b)
    
    add(1,2)
    mins(1,2)
    mul(1,2)
    div(1,2)
    '''
    add was called
    (1, 2)
    3
    mins was called
    (1, 2)
    -1
    mul was called
    (1, 2)
    2
    div was called
    (1, 2)
    0.5
    '''
    

二、python面向对象(下)

2.1继承

  • 继承的好处:代码重用,升级功能(重写),新增功能(新的方法)

  • 定义:

    • class 子类名(父类名):
    • 情况1,如果子类有新增的属性,那么需要在子类__init__方法中,调用父类的__init__
    • 情况2,如果子类没有新增的属性,子类不需要写__init__方法
  • 使用:对象名 = 子类名(参数)

  • Rugby继承Athlete:包括了方法和属性

    例子

    class Rugby(Athlete):
        def __init__(self,a_name,a_bod,a_squat,a_times):
            #调用父类__init__
            Athlete.__init__(self,a_name,a_bod,a_times)
            #深蹲次数
            self.squat = a_squat
        #父类中的方法
        # def top3(self):
        #     return sorted(set([self.sanitize(t) for t in self.times]))[0:3]
        # def sanitize(self,time_string):
        #     if '-' in time_string:
        #         splitter = '-'
        #     elif ':' in time_string:
        #         splitter = ':'
        #     else:
        #         return (time_string)
        #     (mins,secs) = time_string.split(splitter)
        #     return (mins+'.'+secs)
            
    loren = get_coach_data('mywork/loren.txt')
    rugby = Rugby(loren.pop(0),loren.pop(0),loren.pop(0),loren)
    print('姓名:%s,生日:%s,深蹲:%s个,最块的3次成绩:%s' %(rugby.name,rugby.dob,rugby.squat,rugby.top3()))
    '''
    姓名:2011-11-3,生日:270,深蹲:3.59个,最块的3次成绩:['3.11', '3.23', '4.10']
    '''
    

2.2、多继承

  • 注意:应该避免多个父类有相同的属性或方法名

  • 例子

    class Father(): 
        def talk(self):
            print("---爸爸的表达能力---")
    
    class Mather():
        def smart(self):
            print("---妈妈聪明的头脑---")
    
    class Child(Father,Mather):   #如果父类有相同的方法和属性,则调用最左边的父类(即Father)
        pass  #指子类没有东西,但不能不写,不写会报错
    
    child1 = Child()
    child1.talk()
    child1.smart()
    '''
    ---爸爸的表达能力---
    ---妈妈聪明的头脑---
    '''
    

2.3、方法重写

  • 子类方法与父类方法完全相同,子类若重写了父类的方法,则子类对象调用方法时就是调用的自己类中重新的方法。

  • 例子

    class Rugby(Athlete):
        def __init__(self,a_name,a_bod,a_squat,a_times):
            Athlete.__init__(self,a_name,a_bod,a_times)
            self.squat = a_squat
        def top3(self):    #重写父类的方法
            return sorted([self.sanitize(t) for t in self.times])[-3:]
        
        loren = get_coach_data('mywork/loren.txt')
    	rugby = Rugby(loren.pop(0),loren.pop(0),loren.pop(0),loren)
    	print('姓名:%s,生日:%s,深蹲:%s个,最慢的3次成绩:%s' %(rugby.name,rugby.dob,rugby.squat,rugby.top3()))
    '''
    姓名:2011-11-3,生日:270,深蹲:3.59个,最慢的3次成绩:['4.11', '4.21', '4.21']
    '''
    

2.4、多态性

  • 多态的好处:减少重复代码,分离经常改变的代码与不经常改变的代码,使得代码可维护性提高。

  • 下面例子中print_rugby的参数athlete,athlete.name,athlete.top3()的行为由athlete的子类决定。

    • 例子

      loren = get_coach_data('mywork/loren.txt')
      mark = get_coach_data('mywork/mark.txt')
      loren = Rugby(loren.pop(0),loren.pop(0),loren.pop(0),loren)
      mark = OtherAthlete(mark.pop(0),mark.pop(0),mark.pop(0),mark)
      
      def print_rugby(athlete):  #父类作为参数
          print(athlete.name)
          print(athlete.dob)
          print(athlete.squat)
          print(athlete.top3())
      
      print_rugby(loren)
      print_rugby(mark)
      '''
      2011-11-3
      270
      3.59
      ['4.11', '4.21', '4.21']
      mark
      2010-2-4
      300
      ['3.11', '3.11', '3.23']
      '''
      
  • 优化创建对象的代码

    def obj_factory(name,filename):
        with open(filename) as f:
            line = f.readline()
        templ = line.strip().split(',')
        if name == 'r':
            return Rugby(templ.pop(0),templ.pop(0),templ.pop(0),templ)
        elif name == 'oa':
            return OtherAthlete(templ.pop(0),templ.pop(0),templ.pop(0),templ)
    
    oa = obj_factory('oa','mywork/mark.txt')
    print(oa.name)
    '''
    mark
    '''
    

2.5、模块导入

  • import sys
    导入sys模块 sys.path.append(‘work’)
    将模块athlete.py添加到模块搜索路径
    from athlete import *
    导入athlete模块,使用athlete模块下的所有代码

  • import sys
    sys.path.append('mywork')
    
    # import athlete
    # print(dir(athlete))
    from athlete import *   #athlete.py包含Athlete类的代码
    
  • 当两个不同的,模块有相同名字的函数时,需要分别导入进行区分

    import sys
    sys.path.append('mywork')
    
    from p1.mymodule import *
    from p2.mymodule import *
    import p1
    import p2
    p1.mymodule.demo()
    p2.mymodule.demo()
    '''
    p1 -- mymodule
    p2 -- mymodule
    '''
    

你可能感兴趣的:(python速成营,python)