day34
一、mixins机制
1、分主类和辅类, 继承辅类就有该辅类的功能, 不影响子类使用
2、命名方式:以mixin, able 为结尾
3、一般辅类的位置在主类的左边
1 class Vehicle: # 交通工具 2 def run(self): 3 pass 4 def run1(self): 5 pass 6 def run2(self): 7 pass 8 def run3(self): 9 pass 10 def run4(self): 11 pass 12 def run5(self): 13 pass 14 15 # class FlyMixin(): 16 class Flyable(): 17 def fly(self): 18 ''' 19 飞行功能相应的代码 20 ''' 21 print("I am flying") 22 23 class Fly1able(): 24 def fly(self): 25 ''' 26 飞行功能相应的代码 27 ''' 28 print("I am flying") 29 30 class CivilAircraft(Fly1able, Flyable, Vehicle): # 民航飞机 31 pass 32 33 class Helicopter(Flyable, Vehicle): # 直升飞机 34 pass 35 36 class Car(Vehicle): # 汽车并不会飞,但按照上述继承关系,汽车也能飞了 37 pass
二、内置函数==》 魔术方法(简称魔法)
1、__init__()
2、__str__()
1 class Student(): 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 6 # 只有在打印对象的时候才触发 7 def __str__(self): 8 # return "名字:%s" % self.name 9 return '123' # 返回值必须是字符串 10 11 obj = Student('ly', 19) 12 13 print(obj)
3、__del__()
1 class Student(): 2 def __init__(self, name, age): 3 self.name = name 4 self.age = age 5 self.f = open('a', mode='r') 6 7 # 1. 手动删除对象执行 8 # 2. 应用程序执行完毕自动触发(垃圾回收机制会自动删除,触发) 9 def __del__(self): 10 print("__del__") 11 self.f.close() 12 13 obj = Student('ly', 19) 14 15 # del obj 16 17 print("end----->")
补充:
1 "abc" is not str 2 print(isinstance('abc', str)) # 判断'abc'是否为字符串 3 4 class Foo: 5 pass 6 7 print(issubclass(Foo, object)) # 判断Foo是否为object的子类
1、__getattr__
2、__setattr__
3、__delattr__
1 class Foo: 2 x=1 3 def __init__(self,y): 4 self.y=y 5 6 # 当你访问的属性不存在时触发 7 def __getattr__(self, item): 8 print('----> from getattr:你找的属性不存在') 9 10 # 给对象设置值的时候触发 11 # def __setattr__(self, key, value): 12 # print('----> from setattr') 13 # self.key=value # 设置一个值的时候调用此函数,其内部又设置了一个值接着又重新调用其函数,这就无限递归了。 14 # self.__dict__[key]=value #应该使用它 15 # 默认递归的深度为1000 16 # 当删除对象属性时,触发 17 def __delattr__(self, item): 18 print('----> from delattr') 19 # del self.item #无限递归了 20 # self.__dict__.pop(item) 21 22 obj = Foo(10) 23 # obj.m 24 # obj.n =20 25 del obj.x 26 27 #__setattr__添加/修改属性会触发它的执行 28 # f1=Foo(10) 29 # print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值 30 # f1.z=3 31 # print(f1.__dict__) 32 # 33 # #__delattr__删除属性的时候会触发 34 # f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作 35 # del f1.a 36 # print(f1.__dict__) 37 # 38 # #__getattr__只有在使用点调用属性且属性不存在的时候才会触发 39 # f1.xxxxxx
1、__gt__ 大于
2、__lt__ 小于
3、__gte__ 大于等于
4、__lte__ 小于等于
1 class Foo(object): 2 3 # ****** 4 def __init__(self, height): 5 self.height = height 6 7 # 当打印两个对象做比较,用到大于号时调用该函数 8 def __gt__(self, other): 9 return self.height > other.height 10 11 # ****** 12 # def __call__(self, *args, **kwargs): 13 # print('__call__') 14 15 class Bar(object): 16 17 # ****** 18 def __init__(self, height): 19 self.height = height 20 21 obj = Foo(10) # 执行 __init__ 22 # obj() # 执行 __call__ 23 # print(obj) 24 obj1 = Bar(20) 25 26 print(obj > obj1)
三、反射
反射:通过字符串操作类属性或者方法
1 class BlackMedium: 2 feature='Ugly' 3 def __init__(self,name,addr): 4 self.name=name 5 self.addr=addr 6 7 def sell_house(self): 8 print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name) 9 def rent_house(self): 10 print('%s 黑中介租房子啦,傻逼才租呢' %self.name) 11 12 b1=BlackMedium('万成置地','回龙观天露园') 13 14 #检测是否含有某属性 15 print(hasattr(b1,'name')) #判断对象b1中是否有name属性 16 print(hasattr(b1,'sell_house')) #判断对象b1中是否有sell_house属性 17 18 #获取属性 19 n=getattr(b1,'name') # 获取对象b1里的name属性 20 print(n) 21 func=getattr(b1,'rent_house') #获取对象b1里的rent_houses属性(此时的rent_houses是函数属性,因此这里获取的是函数属性的内存地址) 22 func() # 函数的内存地址加()调用函数rent_houses 23 24 # getattr(b1,'aaaaaaaa') #报错,对象b1里找不到该属性会报错 25 print(getattr(b1,'aaaaaaaa','不存在啊')) #获取对象b1中aaaaaaaa属性,若没有其属性,获取其后的属性 26 27 #设置属性 28 setattr(b1,'sb',True) # 在对象b1中设置新的属性sb = 'True' 29 setattr(b1,'show_name',lambda self:self.name+'sb') 30 print(b1.__dict__) 31 print(b1.show_name(b1)) 32 33 #删除属性 34 delattr(b1,'addr') 35 delattr(b1,'show_name') 36 delattr(b1,'show_name111')#不存在,则报错 37 38 print(b1.__dict__)
四、异常处理
1、什么是异常
异常就是错误发生的信号,当遇到该信号,就会抛出异常,如果不对该异常做处理,那么此后的代码都不再执行
具体来说,异常分为两种:
1、语法错误 # SyntaxError
print(11
2、逻辑错误
print(x)
2、为什么用异常
为了增强代码的可靠性,健壮性
3、如何使用异常
1 try: 2 # 被监测的代码1 3 # 被监测的代码1 4 # 被监测的代码1 5 # 被监测的代码1 6 # 被监测的代码1 7 pass 8 except 异常信息1 as e: 9 # 捕捉到异常信息 10 except 异常信息2 as e 11 # 捕捉到异常信息 12 except 异常信息3 as e 13 # 捕捉到异常信息 14 except 异常信息4 as e 15 pass 16 except Exception as e: 17 pass 18 else: 19 print("当被监测的代码没有异常时候执行") 20 finally: 21 print("不管有没有异常都会执行的")
例子:
# SyntaxError # print(11 # print(x) # l = [1, 2, 3] # l[5] # if len(l) > 5: # l[5] # else: # print("索引超出范围") # NameError: name 'x' is not defined # print(x) # IndexError: list index out of range # l = [1, 2, 3] # l[5] # KeyError: 'k1' # dic = {'k':1} # dic['k1'] # class Foo: # pass # # AttributeError: 'Foo' object has no attribute 'x' # obj = Foo() # obj.x # TypeError: 'int' object is not iterable # for i in 123: # pass # ZeroDivisionError: division by zero # 1/0 # catch # try: # print(111) # print(222) # l = [] # l[2] # print(333) # except KeyError as e: # print("KeyError", e) # except IndexError as e: # print("IndexError", e) # except AttributeError as e: # print("AttributeError", e) # except ZeroDivisionError as e: # print("ZeroDivisionError", e) # except Exception as e: # print("我是收低的") # else: # print("当被监测的代码没有异常时候执行") # finally: # print("不管有没有异常都会执行的") # try: # pass # except: # pass # SyntaxError # try: # pass # else: # pass # try: # pass # finally: # pass # # try: # pass # except: # pass # # else: # pass
五、断言
1 l = [1, 2, 3] 2 if len(l) < 5: 3 # return 4 # break 5 raise Exception("断言失败。。。。") 6 7 # 断言 8 assert len(l) == 3 9 10 print("end---->") 11 12 class Animal(): 13 def speak(self): 14 raise Exception("必须实现speak方法") 15 16 class People(Animal): 17 def speak(self): 18 pass 19 20 obj = People() 21 obj.speak() 22 23 # 自定义异常 24 25 class Myexception(BaseException): 26 def __init__(self, msg): 27 self.msg = msg 28 29 def __str__(self): 30 return "异常信息:%s" % self.msg 31 32 raise Myexception("出异常了哈哈哈哈") 33 34 import flask_session

浙公网安备 33010602011771号