1.装饰器
装饰器:为原函数去扩展新功能,用新函数去替换旧函数
作用:为不改变原代码的前提下,实现功能上的扩展
符号:@(语法糖)

# 1.装饰器的基本用法
def kuozhan(func):def newfunc():print("厕所前,蓬头垢面")func()print("厕所后,精神抖擞")return newfuncdef func():print("我是宋云杰")func = kuozhan(func) # func = newfunc
func() # newfunc()# 2.@符号的使用
print("<===============================>")
"""
@符号作用:(1) 可以自动把@符号下面的函数当成参数传递给装饰器(2) 把新函数返回,让新函数去替换旧函数,以实现功能上的扩展(基于原函数)
"""def kuozhan(func):def newfunc():print("厕所前,牛头马面")func()print("厕所后,黑白无常")return newfunc@kuozhan
def func():print("我是高雪峰")func()# 3.装饰器的嵌套
print("<===============================>")
def kuozhan1(func):def newfunc():   print("厕所前,人模狗样1")func()print("厕所后,斯文败类2")return newfuncdef kuozhan2(func):def newfunc():print("厕所前,洗洗手3")func()print("厕所后,簌簌口4")return newfunc@kuozhan2
@kuozhan1
def func():print("我是葛龙0")func()# 4.用装饰器扩展带有参数的原函数
print("<========================>")
def kuozhan(func):def newfunc(who,where):print("厕所前,萎靡不振")func(who,where)print("厕所后,兽性大发")return newfunc@kuozhan
def func(who,where):print("{}在{}解手".format(who,where))func("孙致和","鸟窝") # func = newfunc => func("孙致和","鸟窝") <=> newfunc("孙致和","鸟窝")# 5.用装饰器扩展带有参数和返回值的原函数
print("<========================>")
def kuozhan(func):def newfunc(*args,**kwargs):print("厕所前,饥肠辘辘")res = func(*args,**kwargs)print("厕所后,酒足饭饱")return resreturn newfunc@kuozhan
def func(*args,**kwargs):lst = []dic = {"gaoxuefeng":"高雪峰","sunzhihe":"孙致和","gelong":"戈隆"}# 解手的地点遍历出来for i in args:print("拉屎的地点:",i)for k,v in kwargs.items():if k in dic:strvar = dic[k] + "留下了" + v + "黄金"lst.append(strvar)return lstlst = func("电影院","水下",gaoxuefeng = "15g",sunzhihe = "15顿",gelong="15斤")
print(lst)# 6.用类装饰器来拓展原函数
print("<========================>")
class Kuozhan():def __call__(self,func):        return self.kuozhan2(func)def kuozhan1(func):def newfunc():print("厕所前,老实巴交")func()print("厕所后,咋咋乎乎")return newfuncdef kuozhan2(self,func):def newfunc():print("厕所前,唯唯诺诺")func()print("厕所后,重拳出击")return newfunc# 方法一
""""""
@Kuozhan.kuozhan1
def func():print("厕所进行中....")# func()# 方法二@Kuozhan()  # @obj => obj(func)
def func():print("厕所进行中....")func()
"""
print("<======分割线1=======>")
Kuozhan() #=> obj
def func():print("厕所进行中....")
@符发动第一次发动技能:func 当成参数传递给obj => obj(func) 这种形式把对象当成函数使用 -> 直接触发__call__魔术方法调用结束之后.
@符发动第二次发动技能:将返回的新函数 赋值给 旧函数,形成替换的效果
func = newfunc
func() <=> newfunc()
"""
"""
print("<======分割线2=======>")
<==相当于==>
def func():print("厕所进行中....")
obj = Kuozhan()
func = obj(func)
func()
"""# 7.带有参数的函数装饰器
def outer(num):def kuozhan(func):   def newfunc1(self):print("厕所前,干净整齐")func(self)print("厕所后,一片狼藉")def newfunc2(self):print("厕所前,大腹便便")func(self)print("厕所后,满口雌黄")if num == 1:return newfunc1elif num == 2:return newfunc2elif num == 3:# 把func3方法变成属性return "我是女性"return kuozhanclass MyClass():@outer(1) # => (1) kuozhan(func1) => newfunc1   (2) 发动技能做替换  func1 = newfunc1 def func1(self):print("向前一小步,文明一大步")@outer(2) # => (2) kuozhan(func2) => newfunc2   (2) 发动技能做替换  func2 = newfunc2 def func2(self):print("来也冲冲,去也冲冲")@outer(3) # => (3) kuozhan(func3) => "我是女性" (2) 发动技能做替换  func3 = "我是女性" def func3(self):print("尿道外面,说明你短")obj = MyClass()
print("<================>")
obj.func1() # <=> newfunc1
print("<================>")
obj.func2()
print("<================>")
# obj.func3() error
print(obj.func3)
print(MyClass.func3)"""
套上outer这层函数就是为了保留1 2 3 三个参数,可以在闭包函数中使用
调用outer 结束之后,才是返回正常的装饰器kuozhan
此刻,@符第一次发动技能,把func1当成参数传递给kuozhan , 返回newfunc1
然后,@符第二次发动技能,将返回的newfunc1替换原来func1
obj.func1() => newfunc1(obj)if num == 1 返回闭包函数newfunc1
if num == 2 返回闭包函数newfunc2
来做替换obj.func3 在执行时,装饰器已经把func3变成了属性func3 = "我是女性"
所以obj.func3  或者 MyClass.func3 都是"我是女性" 字符串.
obj.func3 => return "我是女性"
MyClass.func3 => return "我是女性"
"""# 8.带有参数的类装饰器
"""
如果参数是1,就为当前类添加成员属性和方法
如果参数是2,就把原方法run变成属性
"""
class Kuozhan():money = "贵族厕所,每小时1000元,贵族厕所欢迎您来,欢迎您再来"def __init__(self,num):self.num = numdef __call__(self,cls):if self.num == 1:return self.newfunc1(cls)elif self.num == 2:return self.newfunc2(cls)def ad(self):print("贵族茅厕,茅厕中的百岁山")def newfunc1(self,cls):def newfunc():# 为当前cls这个类,添加属性cls.money = Kuozhan.money# 为当前cls这个类,添加方法cls.ad = Kuozhan.adreturn cls()return newfuncdef newfunc2(self,cls):def newfunc():if "run" in cls.__dict__:# 调用类中的方法,得到对应的返回值res = cls.run()# 把返回值重新赋值到run属性上cls.run = res# cls.run = "亢龙有悔"return cls()return newfuncprint("<=====================================>")
# 参数1
@Kuozhan(1)
class MyClass():def run():return "亢龙有悔"
obj = MyClass()
print(obj.money)
obj.ad()"""
参数为1,代码解析:
@Kuozhan(1)  => @obj => @符第一次发动技能:把MyClass当成参数传递给obj => obj(MyClass) => return self.newfunc1(cls) => return newfunc@obj => @符第二次发动技能:实现替换效果,将 MyClass = newfunc obj = MyClass() = newfunc() = cls() = 对象
对象.属性   obj.money
对象.方法   obj.ad()
"""'''
# 全局范围内类
class Ceshi():ad = 10
obj = Ceshi()
print(obj.ad)def func(cls):cls.money = 100return cls()
# 把类当成参数传递到函数当中,在局部空间中,形成独立的副本
obj = func(Ceshi)
# 把类变量Ceshi 变成字符串
Ceshi = "你好"
# 发现局部空间中类对象中的成员,并没有受到影响
print(obj.money) # 100
'''# 参数2
@Kuozhan(2)
class MyClass():def run():return "亢龙有悔"obj = MyClass()
print(obj.run)"""
参数为2,代码解析:
@Kuozhan(2)  => @obj => @符第一次发动技能:把MyClass当成参数传递给obj => obj(MyClass) => return self.newfunc2(cls) => return newfunc@obj => @符第二次发动技能:实现替换效果,将 MyClass = newfunc obj = MyClass() = newfunc() = cls() = 对象
对象.run = "亢龙有悔"
"""

2.面向对象当中的方法
普通方法:有参或者无参,如果是无参,只能用类来调用
绑定方法:(1)绑定到对象,自动传递对象参数(2)绑定到类,自动传递类参数
静态方法:无论是对象还是类,都可以调用此方法,而不会默认传递任何参数

class Cat():name = "tom"# 普通方法def mai_meng():print("小猫会卖萌")# 绑定方法(对象)def attack(self):print("小猫会卅(sua)人")# 绑定方法(类)@classmethoddef youmi(cls):print(cls)print("可以放大招,伤害最高")# 静态方法@staticmethoddef jump(a,b,c,d,e):print("小猫会上树,抓老鼠")obj = Cat()
# 普通方法 (无参方法只能类调用)
Cat.mai_meng()
# obj.mai_meng() error# 绑定方法(对象)
obj.attack()
Cat.attack(obj)# 绑定方法(类)
"""对象和类都可以调用绑定到类的方法 推荐使用类来调用"""
Cat.youmi()
obj.youmi()
# print(obj.__class__)# 静态方法
obj.jump()
Cat.jump()

3.property
可以把方法变成属性使用
作用:控制属性的获取,修改,删除等操作
变向的增加成员的安全性,可以通过自定义的逻辑进行控制
自动触发:要求名字相同,同一个名字
获取@property
设置@属性名.setter
删除@属性名.deleter

# 写法一
class MyClass():def __init__(self,name):self.name = name   @propertydef username(self):# return self.namepass # 不获取@username.setterdef username(self,val):# 在触发时:val =  朴飘乐  self就是本对象# self.name = valpass # 不设置@username.deleterdef username(self):# print("删除方法被触发...")# del self.namepass # 不删obj = MyClass("朴一生")
# 获取属性
print(obj.username)
# 设置属性
obj.username = "朴飘乐"
# 获取属性
print(obj.username)# 删除属性
del obj.username# 获取属性
print(obj.username)# 写法二
class MyClass():def __init__(self,name):self.name = name   # 获取方法def get_username(self):return self.name# pass # 不获取# 设置方法def set_username(self,val):self.name = val# pass # 不获取# 删除方法def del_username(self):# del self.namepass# property(获取方法,设置方法,删除方法)username = property(get_username,set_username,del_username)obj = MyClass("朴仁猛")
# 获取操作
print(obj.username)  # 自动触发get_username方法
# 设置操作
obj.username = "pdd" # 自动触发set_username方法
# 获取操作
print(obj.username)
# 删除操作
del obj.username     # 自动触发del_username方法
# 获取操作
print(obj.username)

秃顶之路-Day24相关推荐

  1. 秃顶之路-Day11

    Day 11 1.return 返回值 自定义函数的返回值,return可以把值返回到函数的调用处 (1)return + 六大标准数据类型,还有类和对象,函数 如果不定义return,默认返回Non ...

  2. 秃顶之路-Day19

    Day 19 import re # findall(正则表达式,字符串) 把符合正则表达式的字符串在列表中返回 # re.findall # ### 预定义字符集 # \d 匹配数字 strvar= ...

  3. 秃顶之路-Day22

    Day 22 1.多态:不同的子类对象,调用相同的父类方法,产生不同的执行结果 关键字:继承.改写 class Soldier():def attack(self):passdef back(self ...

  4. 秃顶之路-Day23

    Day 23 1.__del__魔术方法(析构方法)lf 触发时机:当对象被内存回收的时候自动触发 第一种,页面执行完毕回收所有变量.第二种,所有的对象被del的时候 功能:对象使用完毕后资源回收 参 ...

  5. 程序猿秃顶算工伤吗?

    在各个年龄段的程序猿中,70后以年龄优势遥遥领先,80后开始油腻,90后开始掉发,掉发的迅猛程度隐隐有赶超80后的趋势,脱单已然不是他们最担心的问题,脱发才是! 程序猿敲掉不不光是键盘上的字母,更是头 ...

  6. 当年也是翩翩少年,如今落得秃顶大叔,程序员秃顶算工伤吗?

    在各个年龄段的程序猿中,70后以年龄优势遥遥领先,80后开始油腻,90后开始掉发,掉发的迅猛程度隐隐有赶超80后的趋势,脱单已然不是他们最担心的问题,脱发才是! 程序猿敲掉不不光是键盘上的字母,更是头 ...

  7. 大家都在学C语言吧,作为程序员这有一个问题,秃顶算工伤吗?

    在各个年龄段的程序猿中,70后以年龄优势遥遥领先,80后开始油腻,90后开始掉发,掉发的迅猛程度隐隐有赶超80后的趋势,脱单已然不是他们最担心的问题,脱发才是! 程序猿敲掉不不光是键盘上的字母,更是头 ...

  8. 人又不聪明,还学别人秃顶 - 类似100条-转自小区论坛

    1. 我抽的不是烟,是寂寞! 2. 别在我的坟前哭,脏了我轮回的路. 3. 我这人从不记仇,一般有仇当场我就报了. 4. 已经将整个青春都用来检讨青春,还要把整个生命都用来怀疑生命. 5. 是这样的张 ...

  9. 【本人秃顶程序员】使用Spring Cloud Stream和RabbitMQ实现事件驱动的微服务

    ←←←←←←←←←←←← 快!点关注 让我们展示如何使用Spring Cloud Stream来设计事件驱动的微服务.首先,Spring Cloud Stream首先有什么好处?因为Spring AM ...

最新文章

  1. cherrypy 入门笔记(1) hello world
  2. [CLPR] 定位算法探幽 - 边缘和形态学
  3. 【绝迹篇】C#RSA算法实现
  4. 【已解决】TypeError: ‘<‘ not supported between instances of ‘str‘ and ‘int‘_Python系列学习笔记
  5. ie11浏览器不能显示最新修改的程序,调试出现代码逻辑错误却依旧执行
  6. pandas之DataFrame合并merge
  7. 前端学习(3103):vue+element今日头条管理-hello-react案例
  8. UWP 使用OneDrive云存储2.x api(二)【全网首发】
  9. eos测试规格_希望您的测试更有效? 这样写您的规格。
  10. PIP(Python包管理工具)-Mac环境下安装
  11. Unity3D Slider控件(滑动条)
  12. 谷歌卫星地图下载器与万能地图下载器功能比较
  13. 基于用户的协同过滤推荐算法研究
  14. 数据管理:业务数据清洗,落地实现方案
  15. 服务器命令压缩文件,使用linux的zip命令压缩文件
  16. c语言怎么写最小公倍数的函数,c语言最小公倍数怎么求
  17. Delphi D10.X中实现安卓中文语音合成(中文朗读)就这么简单
  18. 技嘉主板前置面板没有声音的解决
  19. 雷军重金激励,小米鼎新一战
  20. 详解Shell脚本:正则表达式

热门文章

  1. c语言 文档存储,C语言数据的存储
  2. Hadoop分布式(最小集群)搭建(三台虚拟机)
  3. Linux安装JDK1.8并配置环境变量
  4. 【NISP一级】考前必刷九套卷(二)
  5. html跳到jsp显示源码,JSP显示源代码而不是执行
  6. 全球人才的纳斯达克SelfSell潜入英法、瑞士、新加坡“偷人”?
  7. 劳务派遣人员工资计算方法
  8. mysql 复杂行转列_有趣的SQL(4) 行转列的复杂应用和优化思想
  9. Java中getPath,getAbsolutePath和getCanonicalPath区别
  10. 数据备份保护行业“南北战争”已打响,2024年见分晓