1.一般来说,通过继承可以获得父类的属性,还可以通过重载修改其方法。

2.装饰模式可以不以继承的方式而动态地修改类的方法。

3.装饰模式可以不以继承的方式而返回一个被修改的类。

4.基本实现

程序演示如下:

例一:

13_eg1.py

class BeDeco:

def be_edit_fun(self):

print('Source fun.')

def be_keep_fun(self):

print('Keep fun.')

class Decorater:

def __init__(self,dec):

self._dec = dec()

def be_edit_fun(self):

print('Start...')

self._dec.be_edit_fun()

def be_keep_fun(self):

self._dec.be_keep_fun()

if __name__ == '__main__':

bd = BeDeco()

bd.be_edit_fun()

bd.be_keep_fun()

dr = Decorater(BeDeco)

dr.be_edit_fun()

dr.be_keep_fun()

程序的运行结果为:

例二:

13_eg2.py

class Water:

def __init__(self):

self.name = 'Water'

def show(self):

print(self.name)

class Deco:

def show(self):

print(self.name)

class Sugar(Deco):

def __init__(self,water):

self.name = 'Sugar'

self.water = water

def show(self):

print(self.name)

print(self.water.name)

class Salt(Deco):

def __init__(self,water):

self.name = 'Salt'

self.water = water

def show(self):

print(self.name)

print(self.water.name)

if __name__ == '__main__':

w  = Water()

s = Sugar(w)

s.show()

s = Salt(w)

s.show()

程序的运行结果为:

5.类装饰器

程序演示如下:

13_eg3.py

def deco(a_class):

class NewClass:

def __init__(self,age,color):

self.wrapped = a_class(age)

self.color = color

def display(self):

print(self.color)

print(self.wrapped.age)

return NewClass

@deco

class Cat:

def __init__(self,age):

self.age = age

def display(self):

print(self.age)

if __name__ == '__main__':

c = Cat(12,'black')

c. display()

程序的运行结果为:

原文链接:http://www.maiziedu.com/wiki/python/decorative/

Python装饰模式实现源码分享的更多相关文章

  1. 自己写的一个抢票加速的Python小程序源码分享-----纯属娱乐

    最近这段时间频频看到微信群里发什么 抢票加速,智行.携程.飞猪.美团,对于我这能坐客车就不坐火车的人来说,无所谓靠谱不靠谱 突发奇想的整理了下整个抢票加速的逻辑,写了这个小程序,代码很low,拒绝批评 ...

  2. [DeviceOne开发]-土地销售项目源码分享

    一.简介 这个是一个真实项目开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有详细 ...

  3. python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  4. Python解析器源码加密系列之(二):一次使用标准c的FILE*访问内存块的尝试

    摘要:由于近期打算修改Python解释器以实现pyc文件的加密/解密,出于保密的要求,解密之后的数据只能放在内存中,不能写入到文件中.但是后续的解析pyc文件的代码又只能接受FILE*作为入参,所以就 ...

  5. WP8.1&Win10幸运大转盘源码分享

    先AD一下我的群:Win10开发者群:53078485 最近在写一个APP,其中需要一个转盘动画的源码,找了很多但是都没有找到,无奈只好自己来写,写完效果自己还是比较满意的,分享出来,有需要的童鞋可以 ...

  6. 3D语音天气球(源码分享)——完结篇

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 由于这篇文章是本系列最后一篇,有必要进行简单的回顾和思路整理. 这个程序是由两 ...

  7. 3D语音天气球(源码分享)——在Unity中使用Android语音服务

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  8. 3D语音天气球(源码分享)——通过天气服务动态创建3D球

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 这个项目准备分四部分介绍: 一:创建可旋转的"3D球":3 ...

  9. 3D语音天气球(源码分享)——创建可旋转的3D球

    开篇废话: 在9月份时参加了一个网站的比赛,比赛的题目是需要使用第三方平台提供的服务做出创意的作品. 于是我选择使用语音服务,天气服务,Unity3D,Android来制作一个3D语音天气预报,我给它 ...

随机推荐

  1. yum mysql on centos 7

    参考:https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7 centos 7上没有办法使用yum i ...

  2. zoj 3557 How Many Sets II

    How Many Sets II Time Limit: 2 Seconds      Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, n ...

  3. PHP redis负载均衡代码

    <?php /** * This is a Redis exntend class * jay.w */ class RedisClient { public static $instance ...

  4. zookeeper系列之九—zookeeper数据模型

    http://nileader.blog.51cto.com/1381108/946788 本文主要讲述了Zookeeper的数据模型,包括Zookeeper的数据视图,节点的层次结构以及节点类型等基 ...

  5. JAVA排序--[选择排序]

    package com.array; public class Sort_Select { /** * 项目名称:选择排序 ; * 项目要求:用JAVA对数组进行排序,并运用选择排序算法; * 作者: ...

  6. 08.安装Oracle 10g和SQLServer2008(仅作学习使用VirtualBox虚拟机来安装节省电脑资源)

    1.虚拟机和宿主机共享文件夹. 2.右ctrl+F切换VirtualBox全屏 3.安装Oracle 10g 4.输入密码:root------------>下一步 5.勾选网络配置" ...

  7. linux包的相关命令

    apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...

  8. CUBRID学习笔记23 关键字列表

    先放上特殊的字符 Backtick Symbol - `    反引号 同撇 Double Quotes - "      双引号 Square Brackets - [  中括号 如    ...

  9. CUBRID学习笔记 12防火墙设置 linux

    这玩意是linux上用的. 如果你的数据库不是装在linux下可以飘过了 iptables -I INPUT -p tcp --dport 8001 -j ACCEPT iptables -I INP ...

  10. GitHub上不错的Android开源项目(三)

    收集相关系列资料,自己用作参考,练习和实践.小伙伴们,总有一天,你也能写出 Niubility 的 Android App :-) GitHub上不错的Android开源项目(一):http://ww ...