1. #装饰器:对类或者函数进行功能的扩展
  2. '''
  3. #第一步:基本函数
  4. def la():
  5. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  6.  
  7. #调用函数
  8. la()
  9. la()
  10.  
  11. #第二步:扩展函数功能(不能修改原函数)
  12. #用于扩展基本函数的函数
  13. def kuozhan(func):
  14. #扩展功能1
  15. print('la前参拜祈求')
  16. #调用基本函数
  17. func()
  18. #扩展功能2
  19. print('la后还愿感谢')
  20.  
  21. #基本函数
  22. def la():
  23. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  24.  
  25. #扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
  26. la = kuozhan(la)
  27. print(la)
  28.  
  29. #调用函数
  30. #la()
  31. #la()
  32.  
  33. #第三步:使用语法糖(就是语法) @语法
  34.  
  35. #用于扩展基本函数的函数
  36. def kuozhan(func):
  37. #扩展功能1
  38. print('la前参拜祈求')
  39. #调用基本函数
  40. func()
  41. #扩展功能2
  42. print('la后还愿感谢')
  43.  
  44. #基本函数
  45. @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
  46. def la():
  47. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  48.  
  49. print(la)
  50.  
  51. #调用函数
  52. #la()
  53. #la()
  54.  
  55. #第四步:基本装饰器的实现
  56.  
  57. #用于扩展基本函数的函数
  58. def kuozhan(func):
  59. #内部函数(扩展之后的la函数)
  60. def newla():
  61. #扩展功能1
  62. print('la前参拜祈求')
  63. #调用基本函数
  64. func()
  65. #扩展功能2
  66. print('la后还愿感谢')
  67.  
  68. #添加返回值
  69. return newla
  70.  
  71. #基本函数
  72. @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
  73. def la():
  74. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  75.  
  76. #print(la)
  77.  
  78. #调用函数
  79. la()
  80. la()
  81.  
  82. #第五步:带有参数的装饰器和带有返回值的装饰器
  83.  
  84. #用于扩展基本函数的函数
  85. def kuozhan(func):
  86. #内部函数(扩展之后的la函数)
  87. def newla(shui,na):
  88. #扩展功能1
  89. print('la前参拜祈求')
  90. #调用基本函数
  91. func(shui,na)
  92. #扩展功能2
  93. print('la后还愿感谢')
  94.  
  95. #添加返回值
  96. return newla
  97.  
  98. #基本函数
  99. @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
  100.  
  101. def la(who,where):
  102. print(who,'',where,'tuokuzi')
  103. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  104.  
  105. #print(la)
  106. #调用函数
  107. la('yangjun','羊圈')
  108. la('yanfei','鸟巢')
  109.  
  110. #带有返回值的函数
  111. #用于扩展基本函数的函数
  112. def kuozhan(func):
  113. #内部函数(扩展之后的la函数)
  114. def newla():
  115. #扩展功能1
  116. print('la前参拜祈求')
  117. #调用基本函数
  118. result = func()
  119. #扩展功能2
  120. print('la后还愿感谢')
  121.  
  122. #为newla添加返回值
  123. return result
  124.  
  125. #添加返回值(装饰器用于返回未来的la函数的return)
  126. return newla
  127.  
  128. #基本函数
  129. @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
  130. def la():
  131. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  132. return '热翔'
  133.  
  134. #print(la)
  135.  
  136. #调用函数
  137. result = la()
  138. print('函数的返回值为:',result)
  139.  
  140. #第六步:带有收集参数的函数的装饰器
  141.  
  142. def kuozhan(func):
  143. #定义内部函数
  144. def newla(*w,**n):
  145. #扩展功能1
  146. print('la前参拜祈求')
  147. #调用基本函数
  148. func(*w,**n)
  149. #扩展功能2
  150. print('la后还愿感谢')
  151. #返回未来的la函数
  152. return newla
  153.  
  154. #基本函数
  155. @kuozhan
  156. def la(*who,**nums):
  157. print('参与la的人有',who)
  158. print('la了多少',nums)
  159. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  160.  
  161. #调用函数
  162. la('xuyu','wangcheng','xiufeng','zhangbo',xy = '15',wc = '15',xf = '15',zb = '15ml')
  163.  
  164. #第七步:带有参数的装饰器
  165.  
  166. #装饰器
  167. def outer(arg):
  168. #这是装饰器代码
  169. def kuozhan(func):
  170. #print(func)
  171. #未来的la函数
  172. def newla():
  173. # 扩展功能1
  174. print('la前参拜祈求')
  175. # 调用基本函数
  176. func()
  177. # 扩展功能2
  178. print('la后还愿感谢')
  179.  
  180. #未来的chifan函数
  181. def newchifan():
  182. #扩展功能1
  183. print('饭前洗洗手')
  184. #调用基本函数
  185. func()
  186. #扩展功能2:
  187. print('饭后抖一抖')
  188.  
  189. #根据装饰的函数不同 返回不同的结果
  190. if arg == 'la':
  191. #返回的未来的la函数
  192. return newla
  193. elif arg == 'chi':
  194. return newchifan
  195.  
  196. #返回装饰器
  197. return kuozhan
  198.  
  199. #基本函数1
  200. @outer('la')#@装饰器函数
  201. def la():
  202. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  203.  
  204. #基本函数2
  205. @outer('chi')
  206. def chifan():
  207. print('eat meat')
  208.  
  209. #调用基本函数
  210. la()
  211. chifan()
  212.  
  213. #第八步:使用类作为装饰器参数
  214. #装饰器使用的操作类
  215. class Wish:
  216. #祈求方法
  217. def before():
  218. print('la前参拜祈求')
  219.  
  220. #还愿方法
  221. def after():
  222. print('la后还愿感谢')
  223.  
  224. def outer(cls):
  225. #装饰器函数
  226. def kuozhan(func):
  227. def newla():
  228. #扩展1(类中存在扩展内容)
  229. cls.before()
  230. #调用基本函数
  231. func()
  232. #扩展2(类中存在扩展内容)
  233. cls.after()
  234.  
  235. return newla
  236. return kuozhan
  237.  
  238. #基本参数
  239. @outer(Wish)#装饰器
  240. def la():
  241. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  242. #调用函数
  243. la()
  244.  
  245. #第九步:使用类作为装饰器
  246. class Kuozhan:
  247.  
  248. #接受装饰器函数(函数outer)
  249. def __init__(self,arg):
  250. #此处可以将参数存入对象
  251. self.arg = arg
  252.  
  253. #制作一个内部函数(真正的装饰器 函数kuozhan)
  254. def __call__(self,func):
  255. #print(func)
  256. #将func函数存入对象
  257. self.func = func
  258. #返回内部函数
  259. return self.newla
  260.  
  261. #定义内部函数
  262. def newla(self):
  263. #扩展功能1
  264. print('la前参拜')
  265. #调用基本函数
  266. self.func()
  267. #扩展功能2
  268. print('la后还愿')
  269.  
  270. #基本函数
  271. @Kuozhan('la') #la = 对象(la)
  272. def la():
  273. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  274.  
  275. #调用函数
  276. la()
  277.  
  278. #第十步:装饰器来装饰一个类
  279.  
  280. #装饰器函数
  281. def kuozhan(cls):
  282. print(cls)
  283.  
  284. #声明一个类(函数)
  285. def newHuman():
  286. #扩展类的功能1
  287. cls.cloth = '衣服'
  288. #扩展功能2
  289. cls.hat = '帽子'
  290. #调用类(实例化对象)
  291. obj = cls()
  292. #返回实例化的对象
  293. return obj
  294.  
  295. return newHuman
  296.  
  297. #类 (被装饰的类)
  298. @kuozhan #Human = kuozhan(Human)
  299. class Human:#当作一个函数处理 Human()的返回值不是对象
  300. #属性
  301. sex = 'man'
  302. age = 18
  303.  
  304. #方法
  305. def liaomei(self):
  306. print('妹子,这块砖头是你掉的吗')
  307.  
  308. def tian(self):
  309. print('kubi')
  310.  
  311. #实例化对象
  312. result = Human()
  313. print(result)
  314. print(result.cloth)
  315. print(result.hat)
  316. '''
  317.  
  318. #第十一步
  319.  
  320. #装饰器1
  321. def kuozhan1(func):
  322. #定义装饰之后的函数
  323. def newla1():
  324. #扩展功能1
  325. print('1-----la前参拜')
  326. #调用基本函数
  327. func()
  328. #扩展功能2
  329. print('1-----la后还愿')
  330.  
  331. return newla1
  332.  
  333. #装饰器2
  334. def kuozhan2(func):
  335.  
  336. #定义装饰之后的函数
  337. def newla2():
  338. #扩展功能1
  339. print('2-----la前tuokuzi')
  340. #调用基本函数
  341. func()
  342. #扩展功能2
  343. print('2-----la后capigu')
  344.  
  345. return newla2
  346.  
  347. #基本函数
  348. @kuozhan2
  349. @kuozhan1
  350. def la():
  351. print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
  352.  
  353. #调用函数
  354. la()
  355.  
  356. #方法的分类
  357.  
  358. class Cat:
  359. #属性
  360. color = 'orange'
  361. age = 2
  362. sex = '公'
  363.  
  364. #方法
  365. #非绑定类的方法/对象方法/实例方法
  366. def getFish(self):
  367. print(self)
  368. print('抓鱼方法')
  369.  
  370. #绑定类的方法
  371. def say():
  372. print('喵喵~~~')
  373.  
  374. #类方法
  375. @classmethod
  376. def run(cls):
  377. print(cls)
  378. print('猫跑不跑直线取决于耗子')
  379.  
  380. #静态方法
  381. @staticmethod
  382. def jump():
  383. print('跳起来四脚朝地')
  384.  
  385. #实例化对象
  386. mimi = Cat()
  387.  
  388. #对象方法
  389. mimi.getFish()
  390.  
  391. #绑定类的方法
  392. Cat.say()
  393.  
  394. #类方法
  395. Cat.run()
  396.  
  397. #抽象类
  398. #具有抽象方法的类就是抽象类
  399. #抽象方法
  400. #没有方法体的方法就是抽象方法
  401.  
  402. import abc
  403. class Dog(metaclass = abc.ABCMeta):#指定类的元素 -> 制作类的方法
  404. #属性
  405. age = 10
  406. sex = '母'
  407. color = '黑色'
  408.  
  409. #方法
  410. #对象抽象方法
  411. @abc.abstractmethod
  412. def swimming(self):
  413. pass
  414.  
  415. #静态抽象方法
  416. @abc.abstractstaticmethod
  417. def eat():
  418. pass
  419.  
  420. #类抽象方法
  421. @abc.abstractclassmethod
  422. def drink(cls):
  423. pass
  424.  
  425. #绑定类的方法
  426. @abc.abstractmethod
  427. def run():
  428. pass
  429.  
  430. #具体的有内容的方法
  431. def say(self):
  432. print('旺旺')
  433.  
  434. #实例化对象 会报错
  435. #xiaohei = Dog()
  436.  
  437. #抽象类的使用
  438. import abc
  439. #conghao (boss)
  440. class User(metaclass = abc.ABCMeta):
  441. #属性
  442. username = ''
  443. userid = 0
  444.  
  445. #方法
  446.  
  447. #添加用户(mengfei)
  448. @abc.abstractmethod
  449. def add(self,name,pwd):
  450. pass
  451.  
  452. #删除用户(yujiao)
  453. @abc.abstractclassmethod
  454. def dele(cls,uid):
  455. pass
  456.  
  457. #修改用户(shengyue)
  458. @abc.abstractstaticmethod
  459. def mod():
  460. pass
  461.  
  462. #查找用户(conghao)
  463. def find(self):
  464. print('查找用户操作')
  465.  
  466. #文件2(mengfei)
  467. class MFUser(User):
  468. #添加用户(mengfei)
  469. def add(self,name,pwd):
  470. print('添加用户操作')
  471.  
  472. #文件3(yujiao)
  473. class YJUser(MFUser):
  474. #删除用户(yujiao)
  475. @classmethod
  476. def dele(cls,uid):
  477. print(uid)
  478. print('删除用户操作')
  479.  
  480. #文件4(shengyue)
  481. class SYUser(YJUser):
  482. #修改用户(shengyue)
  483. @staticmethod
  484. def mod():
  485. print('修改用户操作')
  486.  
  487. #SYUser是真实的类不是抽象类
  488.  
  489. user = SYUser()
  490.  
  491. #添加操作
  492. user.add('mengfei','mf')
  493.  
  494. #删除操作
  495. SYUser.dele(250)
  496.  
  497. #修改操作
  498. user.mod()
  499.  
  500. #查找操作
  501. user.find()
  502.  
  503. #多态的实现
  504.  
  505. #1.设计抽象类 定义规则
  506. import abc
  507.  
  508. class Animal(metaclass = abc.ABCMeta):
  509. #尿
  510. @abc.abstractmethod
  511. def niao(self):
  512. pass
  513.  
  514. #拉
  515. @abc.abstractmethod
  516. def la(self):
  517. pass
  518.  
  519. #叫
  520. @abc.abstractmethod
  521. def jiao(self):
  522. pass
  523.  
  524. #定义小狗类
  525. class Dog(Animal):
  526. #尿
  527. def niao(self):
  528. print('抬起后腿尿')
  529.  
  530. #拉
  531. def la(self):
  532. print('蹲着拉')
  533.  
  534. #叫
  535. def jiao(self):
  536. print('汪汪叫')
  537.  
  538. #定义小猫类
  539. class Cat(Animal):
  540. #尿
  541. def niao(self):
  542. print('蹲着尿')
  543.  
  544. #拉
  545. def la(self):
  546. print('蹲着拉')
  547.  
  548. #叫
  549. def jiao(self):
  550. print('喵喵叫')
  551.  
  552. #定义小鸡类
  553. class Chick(Animal):
  554. #尿
  555. def niao(self):
  556. print('站着尿')
  557.  
  558. #拉
  559. def la(self):
  560. print('站着拉')
  561.  
  562. #叫
  563. def jiao(self):
  564. print('嗷嗷叫')
  565.  
  566. #动物行为类
  567. class Action():
  568.  
  569. #定义初始化方法
  570. def __init__(self,animal):
  571. #将动物存入对象成员
  572. self.animal = animal
  573.  
  574. #尿
  575. def niao(self):
  576. self.animal.niao()
  577.  
  578. #拉
  579. def la(self):
  580. self.animal.la()
  581.  
  582. #叫
  583. def jiao(self):
  584. self.animal.jiao()
  585.  
  586. #实例化小狗
  587. xiaohei = Dog()
  588.  
  589. #实例化小猫
  590. miaomiao = Cat()
  591.  
  592. #实例化小鸡
  593. huahua = Chick()
  594.  
  595. #实例化行为类对象
  596. a = Action(xiaohei)
  597.  
  598. #调用行为对象的方法
  599. a.niao()
  600. a.jiao()
  601. a.la()
  602.  
  603. #改变行为类对象中的动物
  604. a.animal = miaomiao
  605. #调用行为对象的方法
  606. a.niao()
  607. a.jiao()
  608. a.la
  609.  
  610. #改变行为类对象中的动物
  611. a.animal = huahua
  612. #调用行为对象的方法
  613. a.niao()
  614. a.jiao()
  615. a.la()

Python 装饰器和抽象类的更多相关文章

  1. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  8. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  9. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

随机推荐

  1. 设置Vim编辑器里Tab的长度,行号

    使用Vim编辑器写脚本时,经常会遇到多重循环语句,习惯上会用tab键来补齐.这时设置tab键占用的长度,可以调节界面的松紧度,使其达到令人满意的效果. 在针对个别用户和所有用户来设置时,与编辑SSH相 ...

  2. Tools - GitBook

    GitBook图书绑定自定义的域名 https://jingyan.baidu.com/article/335530daf86c3b19cb41c3f3.html

  3. keepalived入门

    简介 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服 ...

  4. 【vlan-hybird】

    根据项目要求搭建号拓扑图如下: 分别配置pc1-5的ip地址: 配置交换机sw1: 配置交换机sw2

  5. 监听浏览器返回,pushState,popstate 事件,window.history对象

    在WebApp或浏览器中,会有点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面.确认离开页面或执行一些其它操作的需求.可以使用 popstate 事件进行监听返回.后退.上一页操作. 一 ...

  6. 更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe

    更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe po ...

  7. 用状态机表示SFC中的并行分支

    过去一直认为,状态机表示SFC会不会是任务复杂化,这次简单实验了一下,感觉还可以.请看下面的控制. 在SFC中,A和B是一对并行分支,汇合后转移到C分支中,怎么了用状态机表示呢?这里我们在状态机里分别 ...

  8. python内置常用高阶函数(列出了5个常用的)

    原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...

  9. Rmarkdown:输出html设置

    在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...

  10. 教你如何更改xshell中的转发规则

    使用不同的类型转发,与之对应的端口,所以如果想要使用不同类型的转发就要更改端口使其与之一一对应.本集xshell专栏文章将为大家讲解如何更改转发规则. 更改转发规则操作如下: 1.打开会话对话框. 2 ...