day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)
1. 装饰器 / 类中的方法 / 类的方法变属性

# ### 装饰器
"""
定义:装饰器用于拓展原来函数功能的一种语法,返回新函数替换旧函数
优点:在不更改原函数代码的前提下 给函数拓展新的功能
语法:@
""" # 1.装饰器的原型
def kuozhan(func):
def newfunc():
print("厕所前,蓬头垢面")
func()
print("厕所后,容光焕发")
return newfunc def func():
print("我是高富帅") func = kuozhan(func) # func = newfunc
func() # newfunc() # 2.装饰器@符语法
"""
@符有两个作用:
(1)把@符下面的函数当成一个参数传递给装饰器
(2)装饰器经过装饰之后,把新函数返回,让新函数去替换旧函数 (在不改变原有代码的前提下,扩展新功能)
""" def kuozhan(func):
def newfunc():
print("厕所前,衣衫褴褛")
func()
print("厕所后,光鲜亮丽")
return newfunc @kuozhan
def func():
print("我是白富美") func() # 3.装饰器的嵌套
def kuozhan1(func):
def newfunc():
print("厕所前,饥肠辘辘1")
func()
print("厕所后,酒足饭饱2")
return newfunc def kuozhan2(func):
def newfunc():
print("厕所前,洗洗手3")
func()
print("厕所后,簌簌口4")
return newfunc @kuozhan2
@kuozhan1
def func():
print("我是个屌丝5") func() print("<===============>")
# 4.用装饰器装饰带有参数的函数
"""原函数几个参数,装饰之后就是几个参数,不要乱改"""
def kuozhan(func):
def newfunc(who,where):
print("厕所前,饥饿难耐")
func(who,where)
print("厕所后,满口雌黄,口吐芬芳")
return newfunc @kuozhan
def func(who,where):
print("{}在{}解手".format(who,where)) func("黄乐锡","鸟窝") print("<===============>")
# 5.用装饰器装饰带有参数返回值的函数
def kuozhan(func):
# 在定义处 * 和 ** 用来收集,打包
def newfunc(*args,**kwargs):
print("厕所前,萎靡不振")
# 在调用处 * 和 ** 用来打散,解包
res = func(*args,**kwargs)
print("厕所后,兽性大发")
return res return newfunc @kuozhan
def func(*args,**kwargs):
dic = {"zyl":"邹永灵","zl":"张龙","zzl":"众赞林"}
strvar = ""
for i in args:
strvar += i + " "
print("解手地点:" + strvar) # "谁" 留下了"什么"
"""
# 方法一
lst = []
for k,v in kwargs.items():
if k in dic:
res = dic[k] + "留下了" + v + "黄金"
lst.append(res)
"""
# 方法二
lst = [dic[k] + "留下了" + v + "黄金" for k,v in kwargs.items() if k in dic]
return lst res = func("电影院","水里",zyl="15克",zl="15斤",zzl="15吨",ww="没有")
print(res) # 6.用类装饰器装饰原函数
class Kuozhan():
# 原函数被func这个形参接收到了
def __call__(self,func):
# 调用一下kuozhan2函数 , 返回newfunc新函数
return self.kuozhan2(func) def kuozhan1(func):
def newfunc():
print("厕所前,干净整齐")
func()
print("厕所后,臭气熏天")
return newfunc def kuozhan2(self,func):
def newfunc():
print("厕所前,人模狗样")
func()
print("厕所后,原形毕露")
return newfunc # 方法一
@Kuozhan.kuozhan1
def func():
print("厕所进行时 ... ") func() print("<=======>")
# 方法二
@Kuozhan() # @obj => obj(func) 把对象当成函数使用,触发__call__方法
def func():
print("厕所进行时 ... ") # func = newfunc
func() # newfunc() # 7.用带有参数的装饰器装饰原函数
"""为了保留参数n存储的值,在套一层函数形成闭包,延长n的生命周期,供内函数使用"""
def outer(n):
def kuozhan(func):
def newfunc1(self):
print("厕所前,饥肠辘辘1")
func(self)
print("厕所后,呕吐不止1") def newfunc2(self):
print("厕所前,饥肠辘辘2")
func(self)
print("厕所后,呕吐不止2") if n == 1:
return newfunc1
elif n == 2:
return newfunc2
elif n == 3:
return 5488 return kuozhan print("<========================>")
class MyClass(): @outer(1) # @kuozhan
def func1(self):
print("向前一小步,文明一大步") @outer(2)
def func2(self):
print("来也冲冲,去也冲冲") @outer(3)
def func3(self):
print("绿巨人觉得还行") obj = MyClass()
# 扩展原函数新功能
obj.func1() # newfunc1()
obj.func2() # newfunc2()
# 把方法变成属性
print(obj.func3) # func3 = 5488 # 8.用带有参数的类装饰器装饰原函数
"""
如果参数是1,就为当前这个类添加成员属性和方法
如果参数是2,就把当前这个类中的run方法变成属性
""" class Kuozhan():
ad = "贵族茅厕,欢迎您来,欢迎您再来"
def __init__(self,num):
self.num = num def money(self):
print("贵族茅厕,每小时收费100,包月1450.") def __call__(self,cls):
if self.num == 1:
return self.kuozhan1(cls)
elif self.num == 2:
return self.kuozhan2(cls) def kuozhan1(self,cls):
def newfunc():
self.addpty(cls)
# 返回的是对象
return cls() return newfunc def addpty(self,cls):
# 为当前cls添加成员属性
cls.ad = Kuozhan.ad
# 为当前cls添加成员方法
cls.money = Kuozhan.money def kuozhan2(self,cls):
def newfunc():
return self.updatepty(cls) # cls()
return newfunc def updatepty(self,cls):
if "run" in cls.__dict__:
cls.run = cls.run() # "亢龙有悔"
return cls()
"""
@obj => obj(MyClass) => newfunc @符发动第二次技能,将新函数替换旧函数 MyClass = newfunc
obj = MyClass() <=> newfunc() <=> cls()
obj.ad obj.money()
obj.run = "亢龙有悔"
""" # 功能一
@Kuozhan(1) # @obj => obj(MyClass) 把对象当成函数使用了,会触发__call__魔术方法
class MyClass():
def run():
return "亢龙有悔" obj = MyClass()
print(obj.ad)
obj.money() # 功能二
@Kuozhan(2)
class MyClass():
def run():
return "亢龙有悔" obj = MyClass()
print(obj.run) # 扩展1
"""
# 把类当成一个参数传递到函数中,形成一个独立的副本;
class MyClass():
a = 1 def func(cls):
cls.ad = 2
return cls() obj = func(MyClass)
MyClass = 1
print(MyClass)
print(obj.ad) # 可以在函数内部创建类,但是作用域只限定在函数的内部,外部不可见;
def func():
class C():
cbb = 10
obj = C()
return obj
obj = func()
print(obj.cbb)
"""
装饰器 示例代码
# ### 类中的方法
"""
无参的普通方法 : 只能用类调用
绑定方法:
(1)绑定到对象:在调用时,自动传递self对象参数
(2)绑定到类 :在调用时,自动传递cls这个类参数
静态方法:
无论是对象还是类都可以调用,把方法作为普通方法进行使用
""" class Dog():
def __init__(self,name):
self.name = name # 无参普通方法
def eat():
print("小狗喜欢吃屎") # 绑定到对象的方法
def tail(self):
print(self.name)
print("小狗看见主人,喜欢摇尾巴") # 绑定到类的方法
@classmethod
def jump(cls):
print(cls)
print("小狗喜欢接飞盘") # 静态方法
@staticmethod
def jiao():
print("看见主人,就旺旺叫") obj = Dog("迈克尔·旺旺")
# 无参普通方法
# obj.eat() error
Dog.eat() # 绑定到对象的方法
# obj.tail()
# Dog.tail(obj) #不推荐 # 绑定到类的方法
# Dog.jump() # 推荐
# obj.jump() # 静态方法 : 有几个参数就传递几个参数,跟普通方法的调用一样;
# Dog.jiao()
obj.jiao()
类中的方法(绑定方法与静态方法) 示例代码
# ### property
"""
把方法变成属性:用来控制成员的 获取 , 设置 , 删除
@property 获取
@方法名.setter 设置property
@方法名.deleter 删除
"""
# 写法一
class MyClass(): def __init__(self,name):
self.name = name
# 获取
@property
def username(self):
# return self.name
pass # 设置
@username.setter
def username(self,val):
# self.name = val
pass # 删除
@username.deleter
def username(self):
# del self.name
pass obj = MyClass("周永玲")
# 获取username 触发property修饰的方法
res = obj.username
print(res) # 设置username 触发username.setter修饰的方法
obj.username = "王永玲" print(obj.username) # del obj.username 触发sername.deleter装饰器修饰的方法
del obj.username
print(obj.username) # 写法二
class MyClass():
def __init__(self,name):
self.name = name # 获取属性
def get_username(self):
return self.name # 设置属性
def set_username(self,val):
self.name = val # 删除属性
def del_username(self):
# del self.name
pass # 必须按照这个顺序进行传递:获取方法 , 设置方法 , 删除方法
username = property(get_username,set_username,del_username) obj = MyClass("罗宗源")
# 获取属性 自动触发get_username方法
res = obj.username
print(res)
# 设置属性 自动触发set_username方法
obj.username = "黄乐锡"
print(obj.username)
# 删除属性 自动触发del_username方法
del obj.username
print(obj.username)
property_类的方法变属性 示例代码
day20
day20-Python运维开发基础(装饰器 / 类中的方法 / 类的方法变属性)的更多相关文章
- Python运维开发基础01-语法基础【转】
开篇导语 整个Python运维开发教学采用的是最新的3.5.2版,当遇到2.x和3.x版本的不同点时,会采取演示的方式,让同学们了解. 教学预计分为四大部分,Python开发基础,Python开发进阶 ...
- Python运维开发基础08-文件基础【转】
一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...
- Python运维开发基础10-函数基础【转】
一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...
- Python运维开发基础09-函数基础【转】
上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...
- Python运维开发基础07-文件基础【转】
一,文件的基础操作 对文件操作的流程 [x] :打开文件,得到文件句柄并赋值给一个变量 [x] :通过句柄对文件进行操作 [x] :关闭文件 创建初始操作模板文件 [root@localhost sc ...
- Python运维开发基础06-语法基础【转】
上节作业回顾 (讲解+温习120分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 添加商家入口和用户入口并实现物 ...
- Python运维开发基础05-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...
- Python运维开发基础04-语法基础【转】
上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 仅用列表+循环实现“简单的购物车程 ...
- Python运维开发基础03-语法基础 【转】
上节作业回顾(讲解+温习60分钟) #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen #只用变量和字符串+循环实现“用户登陆 ...
随机推荐
- app内区域截图利用html2Canvals保存到手机 截屏 (html2Canvas使用版本是:0.5.0-beta3。)
app内区域截图利用html2Canvals保存到手机 app内有时候需要区域内的截图保存dom为图像,我们可以使用html2Canvas将dom转换成base64图像字符串,然后再利用5+api保存 ...
- HTML连载59-子绝父相
一.子绝父相 1.只使用相对定位,对图片的位置进行精准定位. <!DOCTYPE html> <html lang="en"> <head> & ...
- linux 配置IPSAN存储
一 SAN存储 1.1 SAN存储介绍 存储区域网络(Storage Area Network,简称SAN)采用网状通道(Fibre Channel ,简称FC,区别与Fiber Channel光纤通 ...
- 记录STM32调试
问题:加入红外初始化后,程序卡在红外初始化处 解决思路: 1.确认时钟是不是好的 2.把定时器分解调试(输入捕获.溢出分开一步一步弄) 已解决:定时器的溢出中断 注意:STM32Cube配置好后,需要 ...
- 创业学习---《如何展开竞争情报调研》--D-1.调研模块---HHR计划---以太一堂
第一:<开始学习> 1,投资人看人标准:人品好:创业热情:学习能力. 2,思考题:请你预判一个最靠谱的方向来创业,你会怎么调研呢? 3,预热思考题: (1)在这个赛道,究竟有哪些重要竞争对 ...
- The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team(排序+二分)
这题其实就是瞎搞,稍微想一想改一改就能过. 排序按值的大小排序,之后从后向前更新node节点的loc值,如果后一个节点的loc大于(不会等于)前一个节点的loc,就把前一个节点的loc值设置为后面的l ...
- Qt QML Component 学习笔记
简介 Component是Qt封装好的.只暴露必要接口的QML类型,可以重复利用.一个QML组件就像一个黑盒子,它通过属性.信号.函数和外部世界交互. 一个Component既可以定义在独立的QML文 ...
- C do...while 循环
不像 for 和 while 循环,它们是在循环头部测试循环条件.在 C 语言中,do...while 循环是在循环的尾部检查它的条件. do...while 循环与 while 循环类似,但是 do ...
- mysql-8.0.18-winx64 环境变量的配置
1. 鼠标右击 此电脑 -->属性 如图:进行步骤 1->2->3 接下来就可以使用命令mysql -u root -p登录mysql了 启动mysql的命令为net ...
- win10中,vscode安装go插件排雷指南
最近学习go,想着使用强大的vscode编写go,在安装go插件过程中,遇到了很多问题.下面记录解决方案. 1)win10环境,安装go,vscode,git 配置GOPATH环境变量,在我的电脑-& ...