1. 程式人生 > >Python的裝飾器

Python的裝飾器

ja

裝飾器模式:通過一個類來修改一個類

實例一:

#!/usr/bin/env python
#coding:utf-8
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):
        print ‘be keep‘  #添加了新動作
        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()


結果:

Source fun.
keep fun.
Start ...
Source fun.
be keep
keep fun.
實例二:
#!/usr/bin/env python
#coding:utf-8
class Water:
    def __init__(self):
        self.name=‘Water‘
    def show(self):
        print self.name
‘改類啟到裝飾的作用‘
class Deco:
    #def show(self):
    #    print self.name
    pass
‘Deco 只是一個占位符而已,啟動傳遞參數的作用‘
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()
    
    a=Salt(w)
    a.show()


結果:

Sugar
Water
Salt
Water
實例三:
#!/usr/bin/env python
#coding:utf-8
‘‘‘
裝飾器模式可以不以繼承的方式而動態修改類的方法
裝飾器模式可以不以繼承的方式返回一個被修改的類
‘‘‘
‘類裝飾器‘
def deco(a_class):
    class NewClass:
        def __init__(self,age,color):
            self.wrapped=a_class(age)
            self.color=color
        def display(self):
            print ‘call here‘
            print self.color
            print self.wrapped.age
    return NewClass
@deco
class Cat:
    def __init__(self,age):
        self.age=age
    #def display(self):
    #    print ‘no called here‘
    #    print(self,age)
if __name__==‘__main__‘:
    c=Cat(12,‘black‘)
    c.display()

結果:

call here
black
12


本文出自 “小魚的博客” 博客,謝絕轉載!

Python的裝飾器