面向对象高阶
isinstance ,issubclass
isinstance判断是否为类的实例化对象,会检测父类,有向上传递性,而使用type做判断时只是比较是否属于同一类型.
类似的还有issubclass,判断是否为其子类,也具有向下传递性.
反射
- hasattr:通过字符串判断对象是否包含对应的属性
- getattr:通过字符串用于返回一个对象属性值
- setattr:对已存在的属性进行赋值,如果属性不存在会创建一个新的对象属性,并对属性赋值.
- delattr:通过字符串删除对象属性值
元类
call
比如在类中定义一个call方法,若有一个这个类的实例化对象,则这个实例化对象也可以调用,调用的过程就是触发call的过程.
new
__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化,所以它先于init执行.而且__new__方法返回的值就是一个实例化对象.
首先我们明确:元类可以造类,类可以造实例化对象
元类在造类的过程中有2种方法:
- 类有类名,基类和名称空间,可以先通过exec方法创建一个名称空间,然后通过元类type()实例化传入参数类名,父类object,和刚创建的名称空间
- 通过class关键字加类名,默认父类为object,通过元类中init初始化类名,类的基类object,类的名称空间.
创建元类
通过继承type可以创造元类,在自定义元类里通过init初始化类的属性,通常要继承type的init内容,然后通过call方法的返回值来返回实例化对象,在这个过程中对类的实例化会触发call,通过call中的new方法产生对象,在通过类的init初始化对象的属性,最后返回对象.这个就可以当作元类的模板.
单类
目的时一个类只能产生一个实例
- 利用类的绑定方法的特性
- 利用装饰器
- 利用元类完成单例
异常处理
try:
1/0
except Exception as e:
print(e)
raise
抛出异常
assert
判断某一行代码是否有问题