装饰器

开放封闭原则(面向对象原则的核心) 软件的实体应该是可扩展的 不可修改的 对外扩展是开放得 而对修改是封闭得

​ 装饰器的作用:在不更改原功能的内部函数代码 并且不改变调用方法的情况下为原始函数添加新的功能。

>>>实例:装饰器装饰函数

# 开放封闭原则
def login(func):
    def fun():
        username = 'xianqi'
        passwd = '123456'
        user = input('请输入账号')
        pw = input('请输入密码')
        if user == username and pw == passwd:
            func()
        else:
            pass
    return fun
@login
def index():
    print(111)

if __name__ == '__main__':
    index()

>>>实例:装饰器装饰类

def login(func):
    def fun(*args,**kwargs):
        username = 'xianqchen'
        passwd = '23456'
        user= input('请输入姓名')
        pw= input('请输入密码')
        if user == username and pw == passwd:
             return func(*args,**kwargs)  # 使用装饰器装饰类的时候 需要将参数返函数带参数返回 要不然执行会报错 这样写 也可以装饰函数  
        else:
            pass
    return fun

@login
class Test:
    pass
Test()

>>>多个装饰器装饰同一个函数

多个装饰器装饰同一个函数的时候,执行顺序是从上到下,但是装饰顺序是从下到上,所以 更具业务具体使用装饰器的顺序

def login(func):
    def fun(*args, **kwargs):
        username = 'xianqchen'
        passwd = '123456'
        user = input('请输入姓名')
        pw = input('请输入密码')
        if user == username and pw == passwd:
            return func(*args, **kwargs)
        else:
            return func
    return fun
def login11(func):
    def fun_1(*args, **kwargs):
        print('这是第二个装饰器')
        return func(*args, **kwargs)
    return fun_1
@login
@login11
class Test:
    pass
Test()

>>>python中三个内置的装饰器

>>>>@classmethod
class test:
    @classmethod
    def test_01(cls):
        print('11111')
    def test_02(self):
        print('22222')
    def test_03(self):
        print('33333')
test().test_01()
test.test_01() # 设置了classmethod 类不需要是类就可以调用了
test.test_03() # 没有设置classmethod方法的 类没有实例就调用不了

classmethod装饰了之后,该方法就是一个类方法。

>>>>@staticmethod
class test:
    @staticmethod
    def test_01(name,age):
        print('姓名:%s 年龄:%d' % (name,age))
    def test_02(self):
        print('22222')

    def test_03(self):
        print('33333')

test.test_01('xianqchen',18) # 实例对象也可以调用

静态方法,默认不需要传参数(不会传类也不会传实例对象),实例和类都可以调用

>>>>@property

这个一般用来设置属性

属性的初识
class Person:

    def __init__(self,name,hight,weight):
        self.name = name
        self.__hight = hight
        self.__weight = weight

    @property
    def bmi(self):
        return '%s 的bmi 值%s' %(self.name,self.__weight / self.__hight ** 2)

p1 = Person('pangpang',1.73,90)
# print(p1.bmi())
print(p1.bmi)
# 属性  : 将一个方法伪装成一个属性,在代码的级别上没有本质的提升,但是让其看起来跟合理.
print(p1.name)
p1.name = 'alex'
print(p1.name)
# 属性的改
class Person:
    def __init__(self,name,age):
        self.name = name
        if type(age) is int:
            self.__age = age
        else:
            print( '你输入的年龄的类型有误,请输入数字')
    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,a1):
        '''判断,你修改的年龄必须是数字'''
        if type(a1) is int:
            self.__age = a1
        else:
            print('你输入的年龄的类型有误,请输入数字')

    @age.deleter
    def age(self):
        del self.__age


p1 = Person('帅哥',20)
print(p1.age)
# print(p1.__dict__)
# p1.age = 23
# print(p1.age)
del p1.age

# property : 类似于bmi这种,area,周长....  ***
# @age.setter  **
# @age.deleter *

>>>用类实现通用装饰器

用类实现一个装饰器需要用到__call__方法  
class Test:
    def __init__(self,func):
        self.func =func
    def __call__(self,*args, **kwargs):
        username = 'xianqchen'
        passwd = '1234567'
        user = input('请输入账号')
        pw = input('请输入密码')
        if user == username and pw == passwd:
            return self.func(*args, **kwargs)
        else:
            print('装饰器错误')
@Test
class test01:
    def test(self):
        print('111111111111')
test01().test()
posted @ 2022-04-11 23:44  饭兜  阅读(32)  评论(0编辑  收藏  举报