面向对象(魔术方法、反射、异常、minins)
魔术方法(内置方法)
1.__str__ 、__repr__
当调用类产生对象,如果直接打印对象或输出对象的时候,如果类里有方法__str__或__repr__时,不再打印对象的内存地址,而会运行一遍方法里的代码,然后打印出方法的返回值,返回值只能是字符串。
当两个方法都存在时__str__的优先级更高
class Aa: def __init__(self, name): self.name = name def __str__(self): print('str') return 'aaa' a = Aa('a') print(a) # str aaa
2.__del__
在类里面如果有__del__,当整个程序结束的时候,会执方法里的代码,或者将产生的对象删除的时候会自动触发
可以做一些清楚垃圾的操作
3.isinstance和issubclass
1.isinstance(a,b)
查看对象a是不是类b调用所得的结果,返回布尔值
2.issubclass(a,b)
查看类b是不是类a 的父类,也就是类a有没有继承类b
4.__doc__
可以查看类的内部的详细信息,就是可以查看类的备注,但是只能看当前类的,类所继承的父类并不显示
class Bb: ''' bbb ''' pass class Aa(Bb): ''' aaa ''' pass print(Aa.__doc__) # aaa
5.__enter__和__exit__
联合with一起使用,当出现with 类 as f时,会将__enter__方法执行,并返回值赋予给as后面的变量,如果没有就不返回;当with下的代码块执行结束时,会运行__exit__方法
当with语句中出现异常的时候__exit__如果有形参(exc_type,exc_val,exc_tb)会自动将异常传入
exc_type:异常类型
exc_val:异常值
exc_tb:追溯异常
6.__setattr__、__delattr__、__getattr__
当产生对象的类里面有这三个方法__setattr__、__delattr__、__getattr__,
对象使用点( . )语法属性时
会触发这三个办法,分别是赋值、删除、取值
7.__setitem__、__delitem__、__getitem__
和上一个组合类似,不过现在不是点( . )语法,而是括号( [ ] )语法
8.__call__
当产生对象的类里有__call__方法时,对象()会执行__call__里面的代码,
如果__call__有返回值者 对象()=返回值
反射
反射就是用字符串型式操作
1.getattr
获取,也可以使用方法
class Bb: age = 1 def aa(self): print('aa') return 222 res = Bb() res1 = getattr(Bb, 'age') # 1 print(res1) print(getattr(res, 'aa')()) # 内存地址然后执行 # aaa 222
2.setattr
修改值,原理和用法于getattr类似,但是括号里需要填3个元素,不然会报错
setattrr(stu, ' x ',222) # 对象或类、操作的字符串、所修改的值
如果没有x 这个属性或方法,则添加
3.delattr
删除属性,原理和用法同getattr类似,不过现在是删除
4.hasattr
判断属性或方法在不在类或对象里面,使用和原理同getattr类似
他会返回布尔值
5.用反射来导入模块
res = __import__('datetime') # 导入模块 res2 = getattr(res, 'datetime') print(res2.now()) # 2023-06-29 20:24:58.922506
异常补充
这里的异常不是使用try,而是主动抛出异常,主动去创造异常
当代码遇见
raise xxxxError( ' xxxxxx ')
raise Exception(' xxxxx ') # raise为关键字,后面的错误类型,括号里面是报错信息