3月21日课后总结

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  

posted @ 2023-03-21 20:57  橘子熊何妨  阅读(12)  评论(0)    收藏  举报