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 finally21     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

 

posted @ 2021-07-15 21:18  Gnomeshghy  阅读(49)  评论(0)    收藏  举报