装饰器
开放封闭原则(面向对象原则的核心) 软件的实体应该是可扩展的 不可修改的 对外扩展是开放得 而对修改是封闭得
装饰器的作用:在不更改原功能的内部函数代码 并且不改变调用方法的情况下为原始函数添加新的功能。
>>>实例:装饰器装饰函数
# 开放封闭原则
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()