3/21课后总结
魔术方法(魔法)
# 学习魔术方法主要是记住各个方法的触发条件
class test:
def __init__(self): # 构造方法,实例化类的时候直接调用,里面有个self是用来接收对象的
pass
def __str__(self): # 打印或者输出对象的时候会自动触发,返回值必须是字符串
return '这是str'
def __repr__(self): # 同上,优先级不如其高
return 'repr'
def __del__(self): # 删除对象的时候自动触发,程序运行完毕也会自动执行,主要用来释放系统资源
self.f.close() # 系统资源
class Open:
def __init__(self, name):
self.name = name
def __enter__(self):
print('出现with语句,对象的__enter__被触发,有返回值则赋值给as声明的变量')
def __exit__(self, exc_type, exc_val, exc_tb):
print('with中代码块执行完毕时执行我啊')
print(exc_type) # 报错类型
print(exc_val) # 报错返回的文档
print(exc_tb) # <traceback object at 0x00000216FF48B6C0>
return True # 如果这里不填或者是false,那么reise后面的代码都不执行
with Open('a.txt') as f:
print('=====>执行代码块')
raise TypeError('***着火啦,救火啊***') # 主动报错,后面的代码都不执行
print('0' * 100)
"""有可能出面试题,谈谈with上下文管理器"""
class test:
x=1
def __init__(self,y):
self.y = y
def __setattr__(self, key, value): # 修改对象的属性时执行
print('__setattr__执行了')
# self.key = value 会无线递归,禁止
self.__dict__[key]=value # 可以这么使用
def __delattr__(self, item): # 删除对象的属性时执行
print('__delattr__执行了')
# del self.item #无限递归了
self.__dict__.pop(item) # 可以使用
def __getattr__(self, item): # 查找不到对象的属性时执行
print('__getattr__执行了')
x = test(5)
x.x = 100 # 执行了__setattr__ key是x,value是100
x.z # 执行了__getattr__ item是z
del x.y # 执行了__delattr__ item是y
__setitem__,__getitem,__delitem__ # 这三个基本如上,只不过是对象[属性名]
class Foo:
def __init__(self):
pass
def __call__(self, *args, **kwargs): # 对象加括号的时候会自动触发执行
print('__call__执行了')
obj = Foo() #
obj() # __call__执行了
'''后续课程flask框架源码的时候,__call__方法就是入口'''
反射
# 在python中,反射是指用字符串来操控属性
"""
涉及到
1. getattr()
2. setattr()
3. delattr()
4. hasattr()
这四个内置函数
"""
class test:
x=1
name = 22
def __init__(self):
pass
def fun(self):
print('this is fun')
x = test()
res = getattr(x,'name') # 获取对象的属性,如果该属性存在,第三个值传不传都不影响
print(res)
res1 = getattr(x, 'fun') # 获取对象的方法
res1() # 配合括号使用就可以直接调用该方法,打印则是打印该方法的地址
res2 = getattr(x,'age',18) # 获取对象的属性,如果不存在会报错,给了第三个值则会返回第三个参数的值
print(res2)
res = setattr(x,'name',15) # 如果对象的属性存在则修改
res = setattr(x,'name22',15) # 不存在则增加
print(x.__dict__)
delattr(x,'x') # 删除对象的一个属性,如果属性不存在则报错
print(x.__dict__)
res=hasattr(x, 'name1') # 判断是否存在
print(res)
# 补充
import time
time.sleep(3) # 1
time=getattr(time, 'sleep')(3) # 2
time=getattr(time, 'sleep') # 3
time(3) #3
# 1,2,3 三种表达方式相等
print(time) #打印这个函数的返回值
time = __import__('time')
time.sleep(3)
time = __import__('time') # 等同于import time 用字符串的形式导入模块
time.sleep(3)
random = __import__('random') # 等同于import random
res=random.randint(1, 9)
print(res)
反射的案例
class FtpServer:
def serve_forever(self):
while True:
inp = input('input your cmd>>: ').strip() # get a.txt
cmd, file = inp.split() # get a.txt
if hasattr(self, cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性
func = getattr(self, cmd) # 根据字符串cmd,获取对象self对应的方法属性
func(file)
def get(self, file):
print('Downloading %s...' % file)
def put(self, file):
print('Uploading %s...' % file)
server = FtpServer()
server.serve_forever()
异常
1. 什么是异常?# 异常就是执行过程中发生的错误,在异常后面的代码都不执行
2. 处理异常的完整语法结构
try:
pass
except 类型:
pass
else:
pass
finally:
pass
3. 主动抛出异常
class Animal():
def speak(self):
raise Exception('必须实现speak方法')
class People(Animal):
def speak(self):
pass
obj=People()
obj.speak()
4. # 断言
# assert 1==2 # 必须对,不对就不执行后面的代码
# print(123)
# d = {'username1':'kevin', 'age':20}
# assert 'username' in d
# print('21134243')
import django