上一篇:由浅入深,走进Python装饰器-----第二篇:进阶--函数装饰函数


类装饰器

@类
函数


2.1 用类装饰器来扩展原函数( 对象() )

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回
class KuoZhan():
	def __call__(self,f):
		return self.newfunc(f)
	def newfunc(self,f):
		def in_newfunc():
			print("1")
			f()
			print("2")
		return in_newfunc
		
@KuoZhan()        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)                                                                       
def func():
	print("我是原函数")
	
func()

>>>1
>>>我是原函数
>>>2

2.2 用类装饰器来扩展原函数( 类.方法 )

# 直接调用类方法
class KuoZhan():
	def newfunc(f):
		def in_newfunc():
			print("1")
			f()
			print("2")
		return in_newfunc
		
@KuoZhan.newfunc     # 直接类调用 1. @KuoZhan.newfunc  ==> KuoZhan.newfunc()    2. func = KuoZhan.newfunc(func) = in_newfunc(func)  
def func():
	print("我是原函数")
	
func()

>>>1
>>>我是原函数
>>>2

2.3.1 类装饰类里的方法( 对象() )

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回
class KuoZhan():
	def __call__(self,f):
		return self.newfunc(f)
	def newfunc(self,f):
		def in_newfunc():
			print("1")
			f()
			print("2")
		return in_newfunc
		
  
class MyClass():
	@KuoZhan()        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
	def func():
		print("我是原函数")
		
#调用方式: 类.方法
MyClass.func()

>>>1
>>>我是原函数
>>>2

2.3.2 类装饰类里的方法( 对象() ) --------- 注意调用方式及参数使用

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回
class KuoZhan():
	def __call__(self,f):
		return self.newfunc(f)
	def newfunc(self,f):
		def in_newfunc(self):
			print("1")
			f()
			print("2")
		return in_newfunc
		
  
class MyClass():
	@KuoZhan()        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
	# 此处虽然是类方法,但修饰过后,已经是绑定对象方法 in_newfunc(self)
	def func():
		print("我是原函数")
		
#调用方式: 对象.方法
mc = MyClass()
mc.func()

>>>1
>>>我是原函数
>>>2

2.3.3 类装饰类里的方法( 对象() ) --------- 注意调用方式及参数使用

# 用类装饰器来扩展原函数,  通过对象函数化触发__call__方法,进行返回
class KuoZhan():
	def __call__(self,f):
		return self.newfunc(f)
	def newfunc(self,f):
		def in_newfunc(self):
			print("1")
			f(self)
			print("2")
		return in_newfunc
		
  
class MyClass():
	@KuoZhan()        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
	# 此处是绑定对象方法
	def func(self):
		print("我是原函数")
		
#调用方式: 对象.方法
mc = MyClass()
mc.func()

>>>1
>>>我是原函数
>>>2

2.4.1 类装饰类里的方法( 类.方法 )

# 直接调用类方法
class KuoZhan():
	def newfunc(f):
		def in_newfunc():
			print("1")
			f()
			print("2")
		return in_newfunc
		
  
class MyClass():
	@KuoZhan.newfunc        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
	def func():
		print("我是原函数")
		
#调用方式: 类.方法
MyClass.func()

>>>1
>>>我是原函数
>>>2

2.4.2 类装饰类里的方法( 类.方法 ) --------- 注意调用方式及参数使用

# 直接调用类方法 
class KuoZhan():
    def newfunc(f):
        def in_newfunc(self):
            print("1")
            f()
            print("2")
        return in_newfunc  
  
class MyClass():
    @KuoZhan.newfunc        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
		# 此处虽然是类方法,但修饰过后,已经是绑定对象方法 in_newfunc(self)
    def func():
        print("我是原函数")
        
#调用方式: 对象.方法
mc = MyClass()
mc.func()

>>>1
>>>我是原函数
>>>2

2.4.3 类装饰类里的方法( 类.方法 ) --------- 注意调用方式及参数使用

# 直接调用类方法 
class KuoZhan():
    def newfunc(f):
        def in_newfunc(self):
            print("1")
            f(self)
            print("2")
        return in_newfunc  
  
class MyClass():
    @KuoZhan.newfunc        #1.  KuoZhan() ==> obj    2. @obj  ==>  obj( )   3.  func = obj( func)
		# 此处是绑定对象方法
    def func(self):
        print("我是原函数")
        
#调用方式: 对象.方法
mc = MyClass()
mc.func()

>>>1
>>>我是原函数
>>>2