new方法、定制属性访问、描述符与装饰器

2019年5月1日17:52:12 发表评论 941 views
装饰器:
    本质是函数,能够实现在不修改原来函数的基础上添加功能。
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'>

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: