18.面向对象高阶

面向对象高阶

isinstance ,issubclass

isinstance判断是否为类的实例化对象,会检测父类,有向上传递性,而使用type做判断时只是比较是否属于同一类型.

类似的还有issubclass,判断是否为其子类,也具有向下传递性.

反射

  1. hasattr:通过字符串判断对象是否包含对应的属性
  2. getattr:通过字符串用于返回一个对象属性值
  3. setattr:对已存在的属性进行赋值,如果属性不存在会创建一个新的对象属性,并对属性赋值.
  4. delattr:通过字符串删除对象属性值

元类

call

比如在类中定义一个call方法,若有一个这个类的实例化对象,则这个实例化对象也可以调用,调用的过程就是触发call的过程.

new

__new__方法的第一个参数是这个类,而其余的参数会在调用成功后全部传递给__init__方法初始化,所以它先于init执行.而且__new__方法返回的值就是一个实例化对象.

首先我们明确:元类可以造类,类可以造实例化对象

元类在造类的过程中有2种方法:

  1. 类有类名,基类和名称空间,可以先通过exec方法创建一个名称空间,然后通过元类type()实例化传入参数类名,父类object,和刚创建的名称空间
  2. 通过class关键字加类名,默认父类为object,通过元类中init初始化类名,类的基类object,类的名称空间.

创建元类

通过继承type可以创造元类,在自定义元类里通过init初始化类的属性,通常要继承type的init内容,然后通过call方法的返回值来返回实例化对象,在这个过程中对类的实例化会触发call,通过call中的new方法产生对象,在通过类的init初始化对象的属性,最后返回对象.这个就可以当作元类的模板.

单类

目的时一个类只能产生一个实例

  1. 利用类的绑定方法的特性
  2. 利用装饰器
  3. 利用元类完成单例

异常处理

try:
    1/0
except Exception as e:
    print(e)

raise

抛出异常

assert

判断某一行代码是否有问题

原文地址:https://www.cnblogs.com/yellowcloud/p/11066813.html