1.装饰带有参数的函数
# 定义装饰器
def logging(fn): # fn = sum_num
def inner(a, b):
fn(a, b)
return inner # sum_num = inner
@logging # sum_num = logging(sum_num)
def sum_num(a, b):
result = a + b
print(result)
sum_num(5, 5)
2.装饰带有返回值的函数
# 定义装饰器
def logging(fn): # fn = sum_num
def inner(a, b):
# result = fn(a, b)
# return result
return fn(a, b)
return inner # sum_num = inner
@logging # sum_num = logging(sum_num)
def sum_num(a, b):
result = a + b
return result
res = sum_num(5, 5)
print(res)
3.装饰带有不定长参数的函数
# 定义装饰器
def logging(fn):
def inner(*args, **kwargs):
fn(*args, **kwargs)
return inner
@logging
def sum_num(*args, **kwargs):
print(args, kwargs)
sum_num(1,2,3,6, age=28)
4.通用装饰器
# 定义装饰器
def logging(fn):
def inner(*args, **kwargs):
return fn(*args, **kwargs)
return inner
@logging
def sum_num(*args, **kwargs):
print(args, kwargs)
# return args, kwargs
sum_num(1, 223)
5.多个装饰器的使用
def check1(fn):
def inner():
print("登录验证功能1")
fn()
return inner
def check2(fn):
def inner():
print("登录验证功能2")
fn()
return inner
@check1 #
@check2 # comment = check2(comment)
def comment():
print("发表评论====")
comment()
6.带有参数的装饰器_错误演示
def decorator(fn, flag):
def inner(a, b):
if flag == "+":
print("现在要执行加法运算")
elif flag == "-":
print("现在要执行减法运算")
return fn(a, b)
return inner
@decorator("+")
def add(a, b):
result = a + b
return result
print(add(1, 5))
7.带有参数的装饰器正确操作
def logging(flag):
def decorator(fn):
def inner(a, b):
if flag == "+":
print("现在要执行加法运算")
elif flag == "-":
print("现在要执行减法运算")
return fn(a, b)
return inner
return decorator
@logging("+") # @logging("+")=====> @decorator ===> add = decorator(add)
def add(a, b):
result = a + b
return result
print(add(1, 5))
8.类中call方法的使用
class Check(object):
# def __init__(self):
# print("这是初始化方法==")
# def add(self):
# print("add")
def __call__(self, *args, **kwargs):
print("这是__call__魔法方法=====")
c = Check()
c()
9.类装饰器
class Check(object):
def __init__(self, fn):
self.__fn = fn
def __call__(self, *args, **kwargs):
print("登录验证====")
self.__fn()
@Check # comment = Check(comment)
def comment():
print("发表评论====")
comment()
10.property属性_装饰器方式
class Person(object):
def __init__(self):
self.__age = 0
# 获取属性
@property
def age(self):
return self.__age
@age.setter
def age(self, new_age):
if new_age <= 150:
self.__age = new_age
else:
print("年龄太离谱,重新输入。")
p = Person()
# print(p.age())
print(p.age)
p.age = 160
print(p.age)
11.property属性_类属性的方式
class Person(object):
def __init__(self):
self.__age = 0
# 获取属性
def get_age(self):
return self.__age
def set_age(self, new_age):
if new_age <= 150:
self.__age = new_age
else:
print("年龄太离谱,重新输入。")
age = property(get_age, set_age)
p = Person()
# print(p.get_age())
print(p.age)
p.age = 110
print(p.age)
12.with语句
with open("1.txt", "w") as f:
f.write("hello world")
13.上下文管理器
# 定义File文件类
class File(object):
def __init__(self, file_name, file_model):
self.file_name = file_name
self.file_model = file_model
# 实现__enter__上文方法
def __enter__(self):
print("这是上文方法===")
self.file = open(self.file_name, self.file_model)
return self.file
# 实现__exit__下文方法
def __exit__(self, exc_type, exc_val, exc_tb):
print("这是下文====")
self.file.close()
with File("1.txt", "r") as f:
file_data = f.read()
# 1/0
print(file_data)