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()

 

posted @ 2017-12-12 18:04  Sun阳  阅读(529)  评论(0编辑  收藏  举报