装饰器:
本质是函数,能够实现在不修改原来函数的基础上添加功能。
new方法一定要有返回值,retrun object.___new__(cls)
单例模式:
class A():
def __new__(self,*args,**kwargs):
if not hasattr(cls,'moran')
cls.moran = object.__new__(cls)
retrun cls.moran
类装饰器:
class Myclass:
def __init__(self,funcc):
retrun object.__init__(cls)
def __call__(self,*args,**kwargs):
print('我在执行')
retrun self.funcc()
@Myclass #@以后相当于实例化
def f1():
print('我也在执行')
f1()
类可以做装饰器,但是一定要定义call方法
python自带的三个内置装饰器:
class Rectangle:
def __init__(self,length,width):
self.length = length
self.width = width
def area(self):
areas = self.length *self.width
return areas
@property #就像访问属性一样
def area(self):
return self.width *self.length
@staticmethod #静态方法 和class类断开联系,相当于在类里面写了一个函数,也能够实现不需要实例化,直接用类名调用函数。不能访问类里面其他的类的属性和方法
def func(): #self在调用的时候回报错
print('staticmethod func')
@classmethod #类方法 可以调用类里面的属性和方法
def show(cls): #cls代表类本身
print(cls)
print('show fun')
类装饰器:
class Test_Class:
def __init__(self,func):
self.func = func
def __call__(self):
print('类')
return self.func
@Test_Class
def fun_test():
print('这是个测试函数')
类也可以做装饰器,但是需要定义__call__方法
原理在init里面传入函数,在call里把函数执行了
装饰器要点:
1修饰函数
2给函数增加功能
3三个内置装饰器是需要掌握的,在项目中会经常用到
装饰器基本格式:
def func(f1):
def func1():
print('ssssss')
f1()
def func2():
print('ddddddd')
f1()
return func2
@func
def f1():
print('基础函数')
f1()
结果:
ddddddd
基础函数
类的三个内置装饰器:
#类的三个内置装饰器
class Base():
def __init__(self,name):
self.name = name
age = 18
@property#和访问属性一样
def eat(self):
print('正在吃东西')
@staticmethod#设置静态类,和类断开连接
def run():
print('正在跑步')
@classmethod#设置类方法,cls代表类本身
def work(cls):
print('正在写作业')
print(cls.age)
print(cls)
a = Base('优秀')
print(a.age)
a.eat
a.run()
a.work()
结果:
18
正在吃东西
正在跑步
正在写作业
18
<class '__main__.Base'>