Python装饰模式实现源码分享

时间:2023-03-10 01:26:25
Python装饰模式实现源码分享

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()

程序的运行结果为:

Python装饰模式实现源码分享

例二:

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()

程序的运行结果为:

Python装饰模式实现源码分享

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()

程序的运行结果为:

Python装饰模式实现源码分享

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