#装饰器:对类或者函数进行功能的扩展 ‘‘‘ #第一步:基本函数 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()
时间: 2024-10-07 12:03:30