又开始的python-day11-20200828-装饰器简单了解

    科技2024-07-24  15

    # 定义一个点类 # 属性是横向坐标 x 与纵向坐标 y # 定义一个圆类 circle # 属性有圆心点 cp 与 半径 radius # 方法有 # 1.求圆的面积 # 2.求圆的周长 # 3.求指定点与圆的关系 # 提示:关系有三种 【圆内 圆外 圆上】 # 涉及到的数学公式 import math class Pointer(object): def __init__(self,x,y): self.x = x self.y = y class Circle(object): def __init__(self,cp,radius): self.cp = cp self.radius = radius def get_area(self): return self.radius ** 2 * math.pi def get_length(self): return self.radius * 2 * math.pi def relationship(self,point): """ 判断点到圆的距离 点和圆心的距离和半径对比 """ distance = math.sqrt((point.x - self.cp.x) ** 2 + (point.y - self.cp.y) ** 2) if distance > self.radius: print('点在圆外') elif distance < self.radius: print('点在圆内') else: print('点在圆上') p = Pointer(3,4) c = Circle(p,5) print(c.get_area()) print(c.get_length()) p1 = Pointer(10,10) c.relationship(p1) p2 = Pointer(0,0) c.relationship(p2) # 宠物店类 PetShop # 属性 店名 店里的宠物 # 方法 展示所有宠物的信息 # 狗 # 猫 class PetShop(object): def __init__(self,shop_name,pet_list=None): self.shop_name = shop_name if pet_list is None: pet_list = [] self.pet_list = pet_list def show_pets(self): if len(self.pet_list) == 0: print('本店还没有宠物') return print('{}有{}宠物'.format(self.shop_name,len(self.pet_list))) for pet in self.pet_list: # print('姓名:{},性别:{},品种:{},年龄:{}'.format(pet.name,pet.gender,pet.breed,pet.age)) print(pet) # class PetDog(object): # def __init__(self,name,gender,age,breed): # self.name = name # self.gender = gender # self.age = age # self.breed = breed # def bark(self): # print(self.name + '正在汪汪汪汪') # def bulid_home(self): # print(self.name + '正在拆家') # def eat(self): # print(self.name + '正在啃骨头') # class PetCat(object): # def __init__(self,name,gender,age,breed,eyes_color): # self.name = name # self.gender = gender # self.age = age # self.breed = breed # self.eyes_color = eyes_color # def bark(self): # print(self.name + '正在喵喵喵') # def sajiao(self): # print(self.name + '正在撒娇') # def eat(self): # print(self.name + '正在吃鱼') class Pet(object): def __init__(self,name,gender,age,breed): self.name = name self.gender = gender self.age = age self.breed = breed def bark(self): print(self.name + '正在叫') def eat(self): print(self.name + '正在吃') def __str__(self): return '姓名:{},性别:{},品种:{},年龄:{}'.format(self.name,self.gender,self.breed,self.age) class PetDog(Pet): def __init__(self,name,gender,age,breed): super(PetDog,self).__init__(name,gender,age,breed) def bark(self): print(self.name + '正在汪汪汪汪') def bulid_home(self): print(self.name + '正在拆家') def eat(self): print(self.name + '正在啃骨头') class PetCat(Pet): def __init__(self,name,gender,age,breed,eyes_color): super(PetCat,self).__init__(name,gender,age,breed) self.eyes_color = eyes_color def bark(self): print(self.name + '正在喵喵喵') def sajiao(self): print(self.name + '正在撒娇') def eat(self): print(self.name + '正在吃鱼') def __str__(self): x = super(PetCat,self).__str__() x += ',眼色:{}'.format(self.eyes_color) return x ps1 = PetShop('萌宠') ps1.show_pets() dog1 = PetDog('大黄','female',3,'哈士奇') dog2 = PetDog('二黄','male',2,'萨摩耶') cat1 = PetCat('tom','male',2,'英短','blue') cat2 = PetCat('tom2','male',22,'英短','blue') ps2 = PetShop('萌宠',[dog1,dog2,cat1,cat2]) ps2.show_pets() # 打印列表 repr方法 # 学生类 Student # 属性 学号 姓名 年龄 性别 成绩 # 班级类 Grade # 属性 班级名称 班级中的学生 列表储存学生 # 方法 查看该班级中的所有学生信息 # 查看指定学号的学生信息 # 查看班级中成绩不及格的学生信息 # 将班级中的学生按照成绩降序排序 class Student(object): def __init__(self,number,name,age,gender,score): self.number = number self.name = name self.age = age self.gender = gender self.score = score def __str__(self): return '编号:{},姓名:{},性别:{},分数:{}'.format(self.number,self.name,self.gender,self.score) class Grade(object): def __init__(self,name,students): self.name = name self.students = students def show_all(self): for student in self.students: print(student) # print('编号:{},姓名:{},性别:{},分数:{}'.format(studert.number,studert.name,studert.gender,studert.score)) def failed_students(self): result = filter(lambda student:student.score < 60,self.students) for student in result: print(student) def order_students(self): # self.students.sort(key=lambda s:s.score,reverse=True) # 直接改源数据 return sorted(self.students,key=lambda s:s.score,reverse=True) # 不修改元数据 def get_students_by_number(self,n): for s in self.students: if s.number == n: return s s1 = Student(1,'张三',18,'male',90) s2 = Student(2,'李四',15,'male',56) s3 = Student(3,'王五',16,'male',45) s4 = Student(4,'麻子',24,'male',89) s5 = Student(5,'小明',22,'male',70) g = Grade('中二班',[s1,s2,s3,s4,s5]) g.show_all() g.failed_students() x = g.order_students() for i in x: print(i) y = g.get_students_by_number(4) print(y) ## finally 关键字的使用 # file = open('../test') # try: # while True: # content = file.read(1024) # if not content: # break # print(content) # finally: # 最终都会被执行的代码 即使上面的报错了 # print('文件被关闭了') # file.close() # 一般情况下 一个函数最多只能执行一个return语句 # finally 下可以多个 def demo(a,b): try: x = a / b except ZeroDivisionError: return '除数不能为零' else: return x finally: # return 'good' # finally 的返回值 会覆盖之前的return的返回值 print('1234') # print(demo(1,2)) print(demo(1,0)) # with关键字 的使用 try: file = open('../sds','r',encoding='utf8') except FileNotFoundError: print('文件未找到') else: try: file.read() finally: file.close() try: with open('../sdf','r',encoding='utf8') as file: file.read() # 不需要手动关闭文件 # with 关键字 会帮助我们关闭文件 except FileNotFoundError: print('文件未找到') # 上下文管理器 很多需要手动关闭的连接 # 比如说 文件连接 socket连接 数据库的连接 都能使用with关键字自动关闭 # with 关键字后面的对象 需要实现 __enter__ __exit__ 魔法方法 class Demo(object): def __enter__(self): pass def __exit__(self,exc_type,exc_val,exc_tb): pass def create_obj(): return Demo() with create_obj() as d: # as 变量名 创建的对象调用 __enter__ 方法之后的返回值 print(d) # 了解下 # 自定义异常 # 系统内置的异常 # ZeroDivisionError # print(1/0) 除以0 # FileNotFoundError # open(../) 文件不存在 # FileExistError # 多次创建同名文件夹 # ValueError # int('hello') 值不对 # KeyError # person={'name':'zz'} person['age'] 不存在key # SyntaxError # print('2','sdsd') 中文符号 # IndexError # names = ['zss','list'] names[5] # 要求 让用户输入用户名和密码 如果用户名和密码的长度6-12位正确 否则不正确 class MyError(Exception): def __init__(self,x,y): self.x = x self.y = y def __str__(self): return '密码长度在{}和{}之间'.format(self.x,self.y) # passwd = input('请输入您的密码:') # if 6 <= len(passwd) <= 12: # print('密码正确') # else: # # print('密码不正确') # # 使用 raise 关键字可以抛出一个异常 # # raise ValueError('密码错误') # raise MyError(6,12) # print('把密码保存到数据库') # 装饰器回顾 def can_play(fn): def inner(name,game,**kwargs): clock = kwargs.get('clock',21) if clock >= 21: print('太晚了不能玩') else: fn(name,game) return inner @can_play def play_game(name,game): print(name + '在玩' + game) play_game('张三','王者',clock=20) # 高级装饰器 def can_play(clock): def handle_action(fn): def do_action(name,game): if clock < 21: fn(name,game) else: print('太晚了不能玩') return do_action return handle_action @can_play(20) # 装饰器函数带参数 def play_game(name,game): print(name + '在玩' + game) # play_game('张三','王者',clock=20) play_game('张三','王者') # 装饰器的练习 # 权限因子 # 用户权限 & 权限因子 !=0 就是有权限 同为1则为1 不然为0 # 8 4 2 1 user_permission = 9 # 1011 read_permission = 4 # 1011 & 0100 == 0000 write_permission = 2 # 1011 & 0010 == 0010 exe_permission = 1 # 1011 & 0001 == 0001 del_permission = 8 # 1000 & def check_permission(x,y): def handle_action(fn): def do_action(): if x & y != 0: # 有权限可以执行 fn() else: print('对不起,您没有相应的权限') return do_action return handle_action @check_permission(user_permission,read_permission) def read(): print('读取') @check_permission(user_permission,write_permission) def write(): print('写入') @check_permission(user_permission,exe_permission) def execute(): print('执行') @check_permission(user_permission,del_permission) def delete(): print('删除') read() write() execute() delete() ## 可迭代对象和迭代器 # 有很多可迭代对象 list tuple dict set str range filter map # for..in 后跟可迭代对象 from collections.abc import Iterable class Foo(): def __next__(self): return 1 class Demo(object): def __init__(self,x): self.x = x self.count = 0 def __iter__(self): # 只要重写了__iter__方法 就是一个可迭代对象 # return Foo() return self def __next__(self): # 每一次for...in 都会调用一次 __next__ 方法 获取返回值 self.count += 1 if self.count <= self.x: # return 'hello' return self.count - 1 else: raise StopIteration # 让迭代器停止 d = Demo(10) names = list(('zhangsan','lisi')) # a = int('123') print(isinstance(d,Iterable)) # 判断是不是可迭代对象 print(isinstance(names,Iterable)) for i in d: # for...in 本质就是调用对象的 __iter__ 方法 获取返回值 # 这个返回值是一个迭代器对象 在调用对象的 __next__ 方法 print(i) for i in range(10): print(i) # 迭代器的使用 class Demo(object): def __init__(self,x): self.x = x self.count = 0 def __iter__(self): return self def __next__(self): self.count += 1 if self.count <= self.x: return self.count - 1 else: raise StopIteration d = Demo(10) print(d.__iter__().__next__()) # 实际就是这样调用方法 i = iter(d) #内置函数 iter 可以获取到一个可迭代对象的迭代器 print(next(i)) # 和上面效果一样的 # 使用迭代器生成斐波那契数列 class Fibonacci(object): def __init__(self,n): self.n = n self.num1 = self.num2 = 1 self.count = 1 def __iter__(self): return self def __next__(self): self.count += 1 if self.count <= self.n: self.num1,self.num2 = self.num2,self.num1 + self.num2 return self.num1 else: raise StopIteration f = Fibonacci(11) # 占时间 不占空间 for i in f: print(i) # 既然有了列表 为什么还要生成器 num1 = [1,23,4,5,6,7,8,9,0,0,0,21] # 占空间 不占时间
    Processed: 0.013, SQL: 8