废话不多说,直接上源码。注:下面方法只对类下函数调用前做一些数据处理,下一章补充函数前后数据处理,所有函数异常捕获,干预函数传参等
def outer(myclass):
class Inner(myclass):
def __getattribute__(self, item):
x = super().__getattribute__(item) # 调用父类的getattribute方法
print('这里可以写入你的功能函数')
return x
return Inner
@outer
class MyClass: # 目标类,通过装饰MyClass来装饰类下面所有方法
def func_name(self, name):
print('my name is %s'%name)
def func_age(self, age)
print('my age is %s'age)
MyClass().func_name('wang')
MyClass().func_age('12')
==================================================================================
>>>这里可以写入你的功能函数
>>>my name is wang
>>>这里可以写入你的功能函数
>>>my age is 12
>==================================================================================
思考1 : 通过以上代码装饰类下每一个方法基本实现
当我们获取类属性时也会触发
@outer
class MyClass: # 目标类,通过装饰MyClass来装饰类下面所有方法
school = 'beijing university'
def func_name(self, name):
print('my name is %s'%name)
def fun_age(self, age)
print('my age is %s'%age)
print(MyClass().school)
print(MyClass.school)
===================================================================================
>>>这里可以写入你的功能函数
>>>beijing university
>>>>beijing university
思考2:装饰指定函数名开头或者结尾的函数
def outer(myclass):
class Inner(myclass):
def __getattribute__(self, item):
x = super().__getattribute__(item) # 调用父类的getattribute方法
if x.__name__.startswith('func_name')
print('这里可以写入你的功能函数')
elif x.__name__.startswith(func_name)
return x
return Inner
@outer
class MyClass: # 目标类,通过装饰MyClass来装饰类下面所有方法
def func_name(self, name):
print('my name is %s' % name)
def fun_age(self, age):
print('my age is %s' % age)
def func_addr(self, addr):
print('my addr is %s' % addr)
MyClass().func_name('wang')
MyClass().func_age('12')
MyClass().func_addr('shenzhen')
==================================================================================
>>>这里可以写入你的功能函数
>>>my name is wang
>>>my age is 12
>>>这里可以写入你的功能函数
>>>my addr is shenzhen
思考3:有参数的装饰器
def outer(scop, name=None):
def mid(cla):
if scop != "class":
print('name')
return cla
else:
class Inner(cla):
def __getattribute__(self, item):
x = super().__getattribute__(item)
print('222222')
print(x.__name__)
return x
return Inner
return mid
@outer(scop=1)
class Myclass:
def name(self):
print('11111')
Myclass().name()
>>> name
>>> 11111
本文介绍了如何使用Python装饰类来装饰类下的所有方法,包括装饰特定函数名的函数,并探讨了带有参数的装饰器。通过示例代码展示了装饰类在函数调用前的数据处理应用,同时预告了后续章节将涉及更全面的功能,如异常捕获和参数干预。
510

被折叠的 条评论
为什么被折叠?



