zoukankan      html  css  js  c++  java
  • Python 装饰器和抽象类

    #装饰器:对类或者函数进行功能的扩展
    '''
    #第一步:基本函数
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #调用函数
    la()
    la()
    
    #第二步:扩展函数功能(不能修改原函数)
    #用于扩展基本函数的函数
    def kuozhan(func):
        #扩展功能1
        print('la前参拜祈求')
        #调用基本函数
        func()
        #扩展功能2
        print('la后还愿感谢')
    
    #基本函数
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
    la = kuozhan(la)
    print(la)
    
    #调用函数
    #la()
    #la()
    
    #第三步:使用语法糖(就是语法)  @语法
    
    #用于扩展基本函数的函数
    def kuozhan(func):
        #扩展功能1
        print('la前参拜祈求')
        #调用基本函数
        func()
        #扩展功能2
        print('la后还愿感谢')
    
    #基本函数
    @kuozhan  #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    print(la)
    
    #调用函数
    #la()
    #la()
    
    
    #第四步:基本装饰器的实现
    
    #用于扩展基本函数的函数
    def kuozhan(func):
        #内部函数(扩展之后的la函数)
        def newla():
            #扩展功能1
            print('la前参拜祈求')
            #调用基本函数
            func()
            #扩展功能2
            print('la后还愿感谢')
    
        #添加返回值
        return newla
    
    #基本函数
    @kuozhan  #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #print(la)
    
    #调用函数
    la()
    la()
    
    #第五步:带有参数的装饰器和带有返回值的装饰器
    
    #用于扩展基本函数的函数
    def kuozhan(func):
        #内部函数(扩展之后的la函数)
        def newla(shui,na):
            #扩展功能1
            print('la前参拜祈求')
            #调用基本函数
            func(shui,na)
            #扩展功能2
            print('la后还愿感谢')
    
        #添加返回值
        return newla
    
    #基本函数
    @kuozhan  #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
    
    def la(who,where):
        print(who,'在',where,'tuokuzi')
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #print(la)
    #调用函数
    la('yangjun','羊圈')
    la('yanfei','鸟巢')
    
    #带有返回值的函数
    #用于扩展基本函数的函数
    def kuozhan(func):
        #内部函数(扩展之后的la函数)
        def newla():
            #扩展功能1
            print('la前参拜祈求')
            #调用基本函数
            result = func()
            #扩展功能2
            print('la后还愿感谢')
    
            #为newla添加返回值
            return result
    
        #添加返回值(装饰器用于返回未来的la函数的return)
        return newla
    
    #基本函数
    @kuozhan  #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
        return '热翔'
    
    #print(la)
    
    #调用函数
    result = la()
    print('函数的返回值为:',result)
    
    
    #第六步:带有收集参数的函数的装饰器
    
    def kuozhan(func):
        #定义内部函数
        def newla(*w,**n):
            #扩展功能1
            print('la前参拜祈求')
            #调用基本函数
            func(*w,**n)
            #扩展功能2
            print('la后还愿感谢')
        #返回未来的la函数
        return newla
    
    #基本函数
    @kuozhan
    def la(*who,**nums):
        print('参与la的人有',who)
        print('la了多少',nums)
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #调用函数
    la('xuyu','wangcheng','xiufeng','zhangbo',xy = '15斤',wc = '15吨',xf = '15克',zb = '15ml')
    
    
    #第七步:带有参数的装饰器
    
    #装饰器
    def outer(arg):
        #这是装饰器代码
        def kuozhan(func):
            #print(func)
            #未来的la函数
            def newla():
                # 扩展功能1
                print('la前参拜祈求')
                # 调用基本函数
                func()
                # 扩展功能2
                print('la后还愿感谢')
    
            #未来的chifan函数
            def newchifan():
                #扩展功能1
                print('饭前洗洗手')
                #调用基本函数
                func()
                #扩展功能2:
                print('饭后抖一抖')
    
            #根据装饰的函数不同 返回不同的结果
            if arg == 'la':
                #返回的未来的la函数
                return newla
            elif arg == 'chi':
                return newchifan
    
        #返回装饰器
        return kuozhan
    
    #基本函数1
    @outer('la')#@装饰器函数
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #基本函数2
    @outer('chi')
    def chifan():
        print('eat meat')
    
    #调用基本函数
    la()
    chifan()
    
    
    #第八步:使用类作为装饰器参数
    #装饰器使用的操作类
    class Wish:
        #祈求方法
        def before():
            print('la前参拜祈求')
    
        #还愿方法
        def after():
            print('la后还愿感谢')
    
    def outer(cls):
        #装饰器函数
        def kuozhan(func):
            def newla():
                #扩展1(类中存在扩展内容)
                cls.before()
                #调用基本函数
                func()
                #扩展2(类中存在扩展内容)
                cls.after()
    
            return newla
        return kuozhan
    
    #基本参数
    @outer(Wish)#装饰器
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    #调用函数
    la()
    
    
    #第九步:使用类作为装饰器
    class Kuozhan:
    
        #接受装饰器函数(函数outer)
        def __init__(self,arg):
            #此处可以将参数存入对象
            self.arg = arg
    
        #制作一个内部函数(真正的装饰器  函数kuozhan)
        def __call__(self,func):
            #print(func)
            #将func函数存入对象
            self.func = func
            #返回内部函数
            return self.newla
    
            #定义内部函数
        def newla(self):
            #扩展功能1
            print('la前参拜')
            #调用基本函数
            self.func()
            #扩展功能2
            print('la后还愿')
    
    #基本函数
    @Kuozhan('la') #la = 对象(la)
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #调用函数
    la()
    
    
    #第十步:装饰器来装饰一个类
    
    #装饰器函数
    def kuozhan(cls):
        print(cls)
    
        #声明一个类(函数)
        def newHuman():
            #扩展类的功能1
            cls.cloth = '衣服'
            #扩展功能2
            cls.hat = '帽子'
            #调用类(实例化对象)
            obj = cls()
            #返回实例化的对象
            return obj
    
        return newHuman
    
    #类 (被装饰的类)
    @kuozhan #Human = kuozhan(Human)
    class Human:#当作一个函数处理  Human()的返回值不是对象
        #属性
        sex = 'man'
        age = 18
    
        #方法
        def liaomei(self):
            print('妹子,这块砖头是你掉的吗')
    
        def tian(self):
            print('kubi')
    
    #实例化对象
    result = Human()
    print(result)
    print(result.cloth)
    print(result.hat)
    '''
    
    #第十一步
    
    #装饰器1
    def kuozhan1(func):
        #定义装饰之后的函数
        def newla1():
            #扩展功能1
            print('1-----la前参拜')
            #调用基本函数
            func()
            #扩展功能2
            print('1-----la后还愿')
    
        return newla1
    
    #装饰器2
    def kuozhan2(func):
    
        #定义装饰之后的函数
        def newla2():
            #扩展功能1
            print('2-----la前tuokuzi')
            #调用基本函数
            func()
            #扩展功能2
            print('2-----la后capigu')
    
        return newla2
    
    #基本函数
    @kuozhan2
    @kuozhan1
    def la():
        print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
    
    #调用函数
    la()
    
    
    #方法的分类
    
    class Cat:
        #属性
        color = 'orange'
        age = 2
        sex = ''
    
        #方法
        #非绑定类的方法/对象方法/实例方法
        def getFish(self):
            print(self)
            print('抓鱼方法')
    
        #绑定类的方法
        def say():
            print('喵喵~~~')
    
        #类方法
        @classmethod
        def run(cls):
            print(cls)
            print('猫跑不跑直线取决于耗子')
    
        #静态方法
        @staticmethod
        def jump():
            print('跳起来四脚朝地')
    
    #实例化对象
    mimi = Cat()
    
    #对象方法
    mimi.getFish()
    
    #绑定类的方法
    Cat.say()
    
    #类方法
    Cat.run()
    
    
    #抽象类
    #具有抽象方法的类就是抽象类
    #抽象方法
    #没有方法体的方法就是抽象方法
    
    import abc
    class Dog(metaclass = abc.ABCMeta):#指定类的元素 -> 制作类的方法
        #属性
        age = 10
        sex = ''
        color = '黑色'
    
        #方法
        #对象抽象方法
        @abc.abstractmethod
        def swimming(self):
            pass
    
        #静态抽象方法
        @abc.abstractstaticmethod
        def eat():
            pass
    
        #类抽象方法
        @abc.abstractclassmethod
        def drink(cls):
            pass
    
        #绑定类的方法
        @abc.abstractmethod
        def run():
            pass
    
        #具体的有内容的方法
        def say(self):
            print('旺旺')
    
    #实例化对象  会报错
    #xiaohei = Dog()
    
    
    #抽象类的使用
    import abc
    #conghao (boss)
    class User(metaclass = abc.ABCMeta):
        #属性
        username = ''
        userid = 0
    
        #方法
    
        #添加用户(mengfei)
        @abc.abstractmethod
        def add(self,name,pwd):
            pass
    
        #删除用户(yujiao)
        @abc.abstractclassmethod
        def dele(cls,uid):
            pass
    
        #修改用户(shengyue)
        @abc.abstractstaticmethod
        def mod():
            pass
    
        #查找用户(conghao)
        def find(self):
            print('查找用户操作')
    
    #文件2(mengfei)
    class MFUser(User):
        #添加用户(mengfei)
        def add(self,name,pwd):
            print('添加用户操作')
    
    #文件3(yujiao)
    class YJUser(MFUser):
        #删除用户(yujiao)
        @classmethod
        def dele(cls,uid):
            print(uid)
            print('删除用户操作')
    
    #文件4(shengyue)
    class SYUser(YJUser):
        #修改用户(shengyue)
        @staticmethod
        def mod():
            print('修改用户操作')
    
    #SYUser是真实的类不是抽象类
    
    user = SYUser()
    
    #添加操作
    user.add('mengfei','mf')
    
    #删除操作
    SYUser.dele(250)
    
    #修改操作
    user.mod()
    
    #查找操作
    user.find()
    
    
    #多态的实现
    
    #1.设计抽象类  定义规则
    import abc
    
    class Animal(metaclass = abc.ABCMeta):
        #尿
        @abc.abstractmethod
        def niao(self):
            pass
    
        #
        @abc.abstractmethod
        def la(self):
            pass
    
        #
        @abc.abstractmethod
        def jiao(self):
            pass
    
    #定义小狗类
    class Dog(Animal):
        #尿
        def niao(self):
            print('抬起后腿尿')
    
        #
        def la(self):
            print('蹲着拉')
    
        #
        def jiao(self):
            print('汪汪叫')
    
    #定义小猫类
    class Cat(Animal):
        #尿
        def niao(self):
            print('蹲着尿')
    
        #
        def la(self):
            print('蹲着拉')
    
        #
        def jiao(self):
            print('喵喵叫')
    
    #定义小鸡类
    class Chick(Animal):
        #尿
        def niao(self):
            print('站着尿')
    
        #
        def la(self):
            print('站着拉')
    
        #
        def jiao(self):
            print('嗷嗷叫')
    
    #动物行为类
    class Action():
    
        #定义初始化方法
        def __init__(self,animal):
            #将动物存入对象成员
            self.animal = animal
    
        #尿
        def niao(self):
            self.animal.niao()
    
        #
        def la(self):
            self.animal.la()
    
        #
        def jiao(self):
            self.animal.jiao()
    
    #实例化小狗
    xiaohei = Dog()
    
    #实例化小猫
    miaomiao = Cat()
    
    #实例化小鸡
    huahua = Chick()
    
    #实例化行为类对象
    a = Action(xiaohei)
    
    #调用行为对象的方法
    a.niao()
    a.jiao()
    a.la()
    
    #改变行为类对象中的动物
    a.animal = miaomiao
    #调用行为对象的方法
    a.niao()
    a.jiao()
    a.la
    
    #改变行为类对象中的动物
    a.animal = huahua
    #调用行为对象的方法
    a.niao()
    a.jiao()
    a.la()
  • 相关阅读:
    leetcode 851. Loud and Rich
    674. 最长连续递增序列
    896. 单调数列
    905. 按奇偶排序数组
    917. 仅仅反转字母
    922. 按奇偶排序数组 II
    925. 长按键入
    929. 独特的电子邮件地址
    933. 最近的请求次数
    自己动手丰衣足食写java贪吃蛇
  • 原文地址:https://www.cnblogs.com/sunyang945/p/8022676.html
Copyright © 2011-2022 走看看